এখান থেকে গৃহীত ।
সি ++ স্ট্যান্ডার্ড লাইব্রেরির বেশিরভাগ টেম্পলেটগুলির জন্য তাদের সম্পূর্ণ ধরণের মাধ্যমে ইনস্ট্যান্ট করা দরকার। তবে shared_ptrএবং unique_ptrএটি আংশিক ব্যতিক্রম। কিছু, তবে তাদের সমস্ত সদস্যেরই অসম্পূর্ণ প্রকারের সাথে তাত্ক্ষণিকভাবে চলতে পারে না। এর জন্য অনুপ্রেরণা হ'ল স্মার্ট পয়েন্টার ব্যবহার করে পিম্পলের মতো আইডিয়মগুলিকে সমর্থন করা এবং অপরিজ্ঞাত আচরণের ঝুঁকি না নিয়ে।
অপরিবর্তিত আচরণটি ঘটতে পারে যখন আপনার কোনও অসম্পূর্ণ প্রকার থাকে এবং আপনি deleteএটিতে কল করেন:
class A;
A* a = ...;
delete a;
উপরেরটি আইনি কোড legal এটি সংকলন করা হবে। আপনার সংকলক উপরের মত উপরের কোডের জন্য একটি সতর্কতা প্রেরণ করতে পারে বা নাও করতে পারে। এটি কার্যকর করা হলে, খারাপ জিনিস সম্ভবত ঘটবে। আপনি যদি খুব ভাগ্যবান হন তবে আপনার প্রোগ্রামটি ক্রাশ হবে। তবে আরও সম্ভাব্য ফলাফল হ'ল আপনার প্রোগ্রামটি নিঃশব্দে স্মৃতি ফাঁস ~A()করবে না যা বলা হয় না।
auto_ptr<A>উপরের উদাহরণে ব্যবহার করে কোনও লাভ হয় না। আপনি এখনও একই অপরিবর্তিত আচরণ পাবেন যেন আপনি কোনও কাঁচা পয়েন্টার ব্যবহার করেছেন।
তবুও, নির্দিষ্ট জায়গায় অসম্পূর্ণ ক্লাস ব্যবহার করা খুব দরকারী! এই যেখানে shared_ptrএবং unique_ptrসাহায্য। এই স্মার্ট পয়েন্টারগুলির মধ্যে একটির ব্যবহার আপনাকে সম্পূর্ণ অসম্পূর্ণ প্রকারের বাদ দিয়ে একটি অসম্পূর্ণ প্রকারের সাথে দূরে সরে যাবে। এবং সর্বাধিক গুরুত্বপূর্ণ, যখন একটি সম্পূর্ণ টাইপ থাকা প্রয়োজন, আপনি সেই সময়ে অসম্পূর্ণ টাইপের সাথে স্মার্ট পয়েন্টারটি ব্যবহার করার চেষ্টা করলে আপনি একটি সংকলন-সময় ত্রুটি পান।
আর কোনও অপরিজ্ঞাত আচরণ নেই:
যদি আপনার কোডটি কম্পাইল করে, তবে আপনি যে কোনও জায়গাতেই একটি সম্পূর্ণ টাইপ ব্যবহার করেছেন।
class A
{
class impl;
std::unique_ptr<impl> ptr_; // ok!
public:
A();
~A();
// ...
};
shared_ptrএবং unique_ptrবিভিন্ন জায়গায় সম্পূর্ণ ধরণের প্রয়োজন। কারণগুলি অস্পষ্ট, একটি গতিশীল মুছক বনাম একটি স্ট্যাটিক মুছক এর সাথে করণীয়। সুনির্দিষ্ট কারণগুলি গুরুত্বপূর্ণ নয়। প্রকৃতপক্ষে, বেশিরভাগ কোডে একটি সম্পূর্ণ প্রকারের প্রয়োজন কোথায় তা সঠিকভাবে জানা আপনার পক্ষে গুরুত্বপূর্ণ নয়। কেবল কোড, এবং আপনি যদি এটি ভুল পান তবে সংকলক আপনাকে বলবে।
তবে এটি আপনার পক্ষে সহায়ক হলে এখানে একটি টেবিল রয়েছে যা সম্পূর্ণরূপে প্রয়োজনীয়তার সাথে সম্মত shared_ptrএবং বেশ কয়েকটি সদস্যের নথি দেয় unique_ptr। সদস্যটির যদি একটি সম্পূর্ণ প্রকারের প্রয়োজন হয়, তবে প্রবেশের "সি" রয়েছে, অন্যথায় সারণি এন্ট্রি "আই" দিয়ে পূর্ণ হবে।
Complete type requirements for unique_ptr and shared_ptr
unique_ptr shared_ptr
+------------------------+---------------+---------------+
| P() | I | I |
| default constructor | | |
+------------------------+---------------+---------------+
| P(const P&) | N/A | I |
| copy constructor | | |
+------------------------+---------------+---------------+
| P(P&&) | I | I |
| move constructor | | |
+------------------------+---------------+---------------+
| ~P() | C | I |
| destructor | | |
+------------------------+---------------+---------------+
| P(A*) | I | C |
+------------------------+---------------+---------------+
| operator=(const P&) | N/A | I |
| copy assignment | | |
+------------------------+---------------+---------------+
| operator=(P&&) | C | I |
| move assignment | | |
+------------------------+---------------+---------------+
| reset() | C | I |
+------------------------+---------------+---------------+
| reset(A*) | C | C |
+------------------------+---------------+---------------+
পয়েন্টার ধর্মান্তর প্রয়োজনীয় যে কোনো অপারেশন উভয়ের জন্য সম্পূর্ণ ধরনের প্রয়োজন unique_ptrএবং shared_ptr।
unique_ptr<A>{A*}কন্সট্রাকটর একটি পার পেয়ে যাবে অসম্পূর্ণ Aশুধুমাত্র কম্পাইলার একটি কল সেট আপ করার প্রয়োজন হয় না যদি ~unique_ptr<A>()। উদাহরণস্বরূপ, আপনি যদি unique_ptrগাদা রাখেন, আপনি একটি অসম্পূর্ণ সঙ্গে পেতে পারেন A। এই বিষয়টিতে আরও বিশদ বিশদটি এখানে পাওয়া যাবে ব্যারি দ্য হ্যাচেটের উত্তরে ।
shared_ptr/unique_ptr" শেষে টেবিল আপনার প্রশ্নের উত্তর দিতে হবে।