সি ++ 03
std::auto_ptr- সম্ভবত প্রথম ড্রাফট সিন্ড্রোমে আক্রান্ত মূলগুলির মধ্যে একটিটি কেবলমাত্র সীমিত আবর্জনা সংগ্রহের সুবিধা সরবরাহ করে। প্রথম খারাপ দিকটি এটি deleteবিনাশকে অ্যারে বরাদ্দকৃত বস্তু ( new[]) রাখার জন্য অগ্রহণযোগ্য করে তোলে । এটি পয়েন্টারের মালিকানা গ্রহণ করে তাই দুটি স্বয়ংক্রিয় পয়েন্টারে একই অবজেক্টটি থাকা উচিত নয়। অ্যাসাইনমেন্ট মালিকানা হস্তান্তর করবে এবং মূল্যকে অটো পয়েন্টারকে নাল পয়েন্টারে পুনরায় সেট করবে । যা সম্ভবত সবচেয়ে খারাপ ব্যর্থতার দিকে নিয়ে যায়; পূর্ববর্তী বর্ণিত অনুলিপি অনুলিপণের কারণে এগুলি এসটিএল পাত্রে ব্যবহার করা যাবে না। যে কোনও ব্যবহারের ক্ষেত্রে চূড়ান্ত আঘাত হ'ল তারা সি ++ এর পরবর্তী স্ট্যান্ডার্ডে অবনমিত হবে।
std::auto_ptr_ref- এটি কোনও স্মার্ট পয়েন্টার নয় এটি আসলে কোনও নকশার বিশদ যা std::auto_ptrনির্দিষ্ট পরিস্থিতিতে নকল এবং অ্যাসাইনমেন্টের অনুমতি হিসাবে ব্যবহার করা হয় allow বিশেষ করে এটি একটি অ-const রূপান্তর করতে ব্যবহার করা যেতে পারে std::auto_ptrএকটি থেকে lvalue Colvin-গিবনস কৌতুক নামেও পরিচিত ব্যবহার পদক্ষেপ কন্সট্রাকটর মালিকানা হস্তান্তর করতে।
বিপরীতে সম্ভবত std::auto_ptrস্বয়ংক্রিয়ভাবে আবর্জনা সংগ্রহের জন্য সাধারণ উদ্দেশ্যে স্মার্ট পয়েন্টার হিসাবে ব্যবহার করার উদ্দেশ্য ছিল না। আমার বেশিরভাগ সীমাবদ্ধ বোঝাপড়া এবং অনুমানগুলি হার্ব সটারের অটো_সিপিটারের কার্যকর ব্যবহারের উপর ভিত্তি করে এবং আমি এটি নিয়মিত ব্যবহার করি যদিও সর্বদা সবচেয়ে অনুকূলিত উপায়ে হয় না।
সি ++ 11
std::unique_ptr- এটি আমাদের বন্ধু যিনি std::auto_ptrএটির প্রতিস্থাপন করবেন এটির সাথে std::auto_ptrকাজ করা, বেসরকারী অনুলিপি নির্মাণকারীর মাধ্যমে মূল্য সুরক্ষা, এসটিএল কনটেইনার এবং অ্যালগরিদম ইত্যাদির সাথে ব্যবহারযোগ্য হয়ে ওঠার মতো দুর্বলতাগুলি সংশোধন করার জন্য মূল উন্নতি ছাড়া কিছুটা একই রকম হবে Since এবং মেমরির পদচিহ্নগুলি সীমাবদ্ধ যা প্রতিস্থাপনের জন্য এটি আদর্শ প্রার্থী, বা সম্ভবত আরও সঠিকভাবে নিজস্ব, কাঁচা পয়েন্টার হিসাবে বর্ণিত। "অনন্য" দ্বারা বোঝা যাচ্ছে যে পয়েন্টারের কেবলমাত্র পূর্বের মত একই মালিক std::auto_ptr।
std::shared_ptr- আমি বিশ্বাস করি এটি টিআর 1 এর ভিত্তিতে এবং এটি boost::shared_ptrএলিয়াসিং এবং পয়েন্টার গাণিতিককেও অন্তর্ভুক্ত করতে উন্নত। সংক্ষেপে এটি একটি গতিশীল বরাদ্দকৃত অবজেক্টের চারপাশে একটি রেফারেন্স গণনা করা স্মার্ট পয়েন্টারকে আবৃত করে। "ভাগ করা" হিসাবে বোঝানো হয়েছে যে পয়েন্টারটি একাধিক ভাগ ভাগের পয়েন্টারের মালিক হতে পারে যখন সর্বশেষ ভাগ করা পয়েন্টারের শেষ রেফারেন্স সুযোগের বাইরে চলে যায় তবে অবজেক্টটি যথাযথভাবে মুছে ফেলা হবে। এগুলি থ্রেডও নিরাপদ এবং বেশিরভাগ ক্ষেত্রে অসম্পূর্ণ প্রকারগুলি পরিচালনা করতে পারে। ডিফল্ট বরাদ্দকারী ব্যবহার করে একটি হ্যাপ বরাদ্দ দিয়ে std::make_sharedদক্ষতার std::shared_ptrসাথে একটি নির্মাণ করতে ব্যবহার করা যেতে পারে ।
std::weak_ptr- একইভাবে টিআর 1 এবং ভিত্তিক boost::weak_ptr। এটি একটি এর মালিকানাধীন কোনও অবজেক্টের একটি রেফারেন্স std::shared_ptrএবং তাই std::shared_ptrরেফারেন্সের গণনা শূন্যে নেমে গেলে অবজেক্টের মোছা বাধা দেয় না । কাঁচা পয়েন্টারে অ্যাক্সেস পাওয়ার জন্য আপনাকে প্রথমে std::shared_ptrকল করে অ্যাক্সেস করতে lockহবে যা std::shared_ptrমালিকানাধীন পয়েন্টারটির মেয়াদ শেষ হয়ে গেছে এবং ইতিমধ্যে ধ্বংস হয়ে গেলে খালি ফিরে আসবে । একাধিক স্মার্ট পয়েন্টার ব্যবহার করার সময় এটি অনির্দিষ্টকালের জন্য ঝুলন্ত রেফারেন্স গণনা এড়াতে প্রাথমিকভাবে কার্যকর।
প্রচার করা
boost::shared_ptr- সম্ভবত বিভিন্নতম পরিস্থিতিতে (এসটিএল, পিআইএমপিএল, আরআইআই ইত্যাদি) ব্যবহার করা সবচেয়ে সহজ এটি একটি ভাগ করা রেফারেন্সযুক্ত গণনা স্মার্ট পয়েন্টার। আমি কিছু পরিস্থিতিতে পারফরম্যান্স এবং ওভারহেড সম্পর্কে কয়েকটি অভিযোগ শুনেছি তবে আমি অবশ্যই এগুলি উপেক্ষা করেছি কারণ তর্কটি কী ছিল তা আমি মনে করতে পারি না। স্পষ্টতই এটি একটি মুলতুবি স্ট্যান্ডার্ড সি ++ অবজেক্টে পরিণত হওয়ার পক্ষে যথেষ্ট জনপ্রিয় ছিল এবং স্মার্ট পয়েন্টারগুলির বিষয়ে আদর্শ সম্পর্কে কোনও ত্রুটি নেই।
boost::weak_ptr- std::weak_ptrএই বাস্তবায়নের উপর ভিত্তি করে অনেকের পূর্ববর্তী বর্ণনার মতো , এটি একটিতে কোনও স্ব-মালিকানা প্রসঙ্গে অনুমতি দেয় boost::shared_ptr। আপনি lock()"দৃ "়" ভাগ করা পয়েন্টারটি অ্যাক্সেস করতে আশ্চর্যরূপে কল করবেন না এবং এটি ইতিমধ্যে ধ্বংস হয়ে যেতে পারে বলে এটি বৈধ কিনা তা নিশ্চিত করার জন্য অবশ্যই পরীক্ষা করা উচিত। ভাগ করে নেওয়া পয়েন্টারটি ফিরে না এসে সঞ্চয় না করে নিশ্চিত হয়ে নিন এবং এটি সম্পন্ন করার সাথে সাথে এটিকে সুযোগের বাইরে চলে যেতে দিন অন্যথায় আপনি ঠিক আবার চক্র সংক্রান্ত রেফারেন্স সমস্যায় ফিরে এসেছেন যেখানে আপনার রেফারেন্স গণনাগুলি স্থির থাকবে এবং অবজেক্টগুলি বিনষ্ট হবে না।
boost::scoped_ptr- এটি সামান্য ওভারহেড সহ একটি সাধারণ স্মার্ট পয়েন্টার বর্গ যা সম্ভবত boost::shared_ptrব্যবহারযোগ্য তখন এর আরও ভাল পারফরম্যান্স বিকল্পের জন্য ডিজাইন করা । এটি std::auto_ptrবিশেষ করে তুলনীয় যে এটি কোনও এসটিএল ধারক হিসাবে উপাদান হিসাবে বা একই বস্তুর একাধিক পয়েন্টার সহ নিরাপদে ব্যবহার করা যায় না।
boost::intrusive_ptr- আমি এটি কখনও ব্যবহার করি নি তবে আমার বোঝার থেকে আপনার নিজের স্মার্ট পয়েন্টারটি সামঞ্জস্যপূর্ণ ক্লাস তৈরি করার সময় এটি ব্যবহার করার জন্য ডিজাইন করা হয়েছে। আপনার নিজের গণনাটি রেফারেন্সটি বাস্তবায়ন করতে হবে, আপনি যদি নিজের শ্রেণিটি জেনেরিক হতে চান তবে আপনাকে কয়েকটি পদ্ধতিও প্রয়োগ করতে হবে, তাছাড়া আপনার নিজের থ্রেড সুরক্ষাও প্রয়োগ করতে হবে। প্লাস সাইড এ সম্ভবত আপনি বাছাই এবং আপনি কতটা বা কত সামান্য "স্মার্টনেস" চান তা বেছে নেওয়ার সবচেয়ে কাস্টম পদ্ধতি দেয়। intrusive_ptrএটি আপনাকে সাধারণত shared_ptrপ্রতিটি বস্তুতে একটি একক apাল বন্টন করতে দেয় তার থেকে বেশি কার্যকর । (ধন্যবাদ আরভিদ)
boost::shared_array- এটি boost::shared_ptrঅ্যারেগুলির জন্য একটি । মূলত new [], operator[]এবং অবশ্যই delete []বেকড হয় This এটি এসটিএল পাত্রে ব্যবহার করা যেতে পারে এবং যতদূর আমি জানি সমস্ত কিছুই boost:shared_ptrকরে যদিও আপনি boost::weak_ptrএগুলি ব্যবহার করতে পারবেন না । আপনি বিকল্পভাবে boost::shared_ptr<std::vector<>>অনুরূপ কার্যকারিতা এবং boost::weak_ptrরেফারেন্সগুলির জন্য ব্যবহারের ক্ষমতা ফিরে পেতে একটি ব্যবহার করতে পারেন ।
boost::scoped_array- এটি boost::scoped_ptrঅ্যারেগুলির জন্য একটি । সঙ্গে boost::shared_arrayপ্রয়োজনীয় সকল অ্যারে ধার্মিকতা মধ্যে বেকড হয়। এই এক অ COPYABLE হয় এবং তাই STL পাত্রে ব্যবহার করা যাবে না। আপনি সম্ভবত এটি ব্যবহার করতে পারেন আপনি এটি ব্যবহার করতে চাইছেন এমন যে কোনও জায়গায় আমি পেয়েছি std::vector। আমি কখনই স্থির করিনি কোনটি আসলে দ্রুততর বা কম ওভারহেড রয়েছে তবে এই স্কোপড অ্যারেটি এসটিএল ভেক্টরের চেয়ে কম জড়িত বলে মনে হয়। আপনি যখন স্ট্যাকের বরাদ্দ রাখতে চান তার boost::arrayপরিবর্তে বিবেচনা করুন।
কিউটি
QPointer- কিউটি ৪.০ এ পরিচয় করিয়ে দেওয়া এটি একটি "দুর্বল" স্মার্ট পয়েন্টার যা কেবলমাত্র কাজ করে QObjectএবং উত্পন্ন ক্লাসগুলির সাথে কাজ করে , যা কিউটি ফ্রেমওয়ার্কে প্রায় সব কিছুই তাই এটি আসলে কোনও সীমাবদ্ধতা নয়। তবে সীমাবদ্ধতা রয়েছে যে এটি কোনও "শক্তিশালী" পয়েন্টার সরবরাহ করে না এবং যদিও আপনি অন্তর্নিহিত অবজেক্টটি বৈধ কিনা তা আপনি পরীক্ষা করতে পারেন তবে isNull()বিশেষত বহু-থ্রেডযুক্ত পরিবেশে এই চেকটি পাস করার পরে আপনার অবজেক্টটি ঠিক ধ্বংস হতে পারে। চতুর্থ লোকেরা এই অবমানিত বিবেচনা করে আমি বিশ্বাস করি।
QSharedDataPointer- এটি একটি "শক্তিশালী" স্মার্ট পয়েন্টারটি সম্ভবত boost::intrusive_ptrএটির সাথে তুলনাযোগ্য যদিও এটি থ্রেড সুরক্ষায় কিছু অন্তর্নির্মিত রয়েছে তবে আপনাকে রেফারেন্স গণনা পদ্ধতি ( refএবং deref) অন্তর্ভুক্ত করতে হবে যা আপনি সাবক্ল্যাসিং করে করতে পারেন QSharedData। বেশিরভাগ কিউইটির মতো অবজেক্টগুলি যথেষ্ট উত্তরাধিকার এবং সাবক্ল্যাসিংয়ের মাধ্যমে সর্বোত্তমভাবে ব্যবহৃত হয় বলে মনে হয় উদ্দিষ্ট নকশা।
QExplicitlySharedDataPointer- QSharedDataPointerএটি স্পষ্টভাবে কল দেয় না বাদে খুব অনুরূপ detach()। QSharedDataPointerরেফারেন্স গণনা শূন্যের কমে যাওয়ার পরে ঠিক কখন আলাদা করতে হবে নিয়ন্ত্রণের ক্ষেত্রে এই সামান্য বৃদ্ধি হিসাবে আমি এই সংস্করণ ২.০ কে কল করব বিশেষত পুরো নতুন অবজেক্টের জন্য মূল্যহীন।
QSharedPointer- পারমাণবিক রেফারেন্স গণনা, থ্রেড নিরাপদ, ভাগযোগ্য পয়েন্টার, কাস্টম মোছা (অ্যারে সমর্থন), স্মার্ট পয়েন্টার হওয়া উচিত বলে মনে হচ্ছে। এটি আমি প্রাথমিকভাবে কিউটিতে একটি স্মার্ট পয়েন্টার হিসাবে ব্যবহার করি এবং আমি এটি তুলনামূলক দেখতে পাই boost:shared_ptrযদিও সম্ভবত Qt এর অনেকগুলি অবজেক্টের মতো উল্লেখযোগ্যভাবে বেশি ওভারহেড।
QWeakPointer- আপনি কি একটি reoccurring নিদর্শন বোঝেন? ঠিক একইভাবে std::weak_ptrএবং boost::weak_ptrএটি QSharedPointerযখন দুটি স্মার্ট পয়েন্টারগুলির মধ্যে আপনার রেফারেন্সের প্রয়োজন হয় তখন তা মিলিয়ে আপনার আইটেমগুলি কখনই মোছার কারণ হতে পারে না।
QScopedPointer- এই নামটিও পরিচিত দেখা উচিত এবং প্রকৃতপক্ষে boost::scoped_ptrভাগ করা এবং দুর্বল পয়েন্টারগুলির কিউটি সংস্করণগুলির বিপরীতে। এটি ওভারহেড ছাড়াই একটি একক মালিককে স্মার্ট পয়েন্টার সরবরাহ করতে কাজ করে QSharedPointerযা এটি সামঞ্জস্যতা, ব্যতিক্রম নিরাপদ কোড এবং আপনি ব্যবহার করতে পারেন std::auto_ptrবা ব্যবহার করতে পারেন এমন সমস্ত জিনিসের জন্য আরও উপযুক্ত করে তোলে boost::scoped_ptr।