unique_ptr অনুলিপিযোগ্য নয়, এটি কেবল চলনযোগ্য।
এটি সরাসরি টেস্টকে প্রভাবিত করবে, এটি আপনার দ্বিতীয় ক্ষেত্রে উদাহরণটি কেবল চলনযোগ্য এবং অনুলিপিযোগ্য নয়।
আসলে, আপনি এটি ব্যবহার করা ভাল যা আপনাকে unique_ptrএকটি বড় ভুল থেকে রক্ষা করে।
উদাহরণস্বরূপ, আপনার প্রথম কোডের সাথে মুখ্য বিষয়টি হ'ল পয়েন্টারটি কখনও মুছে ফেলা হয় না যা সত্যই, সত্যই খারাপ। বলুন, আপনি এটি দ্বারা এটি ঠিক করবেন:
class Test
{
int* ptr; // writing this in one line is meh, not sure if even standard C++
Test() : ptr(new int(10)) {}
~Test() {delete ptr;}
};
int main()
{
Test o;
Test t = o;
}
এটিও খারাপ। কি হয়, কপি করলেই হয়Test ? দুটি ক্লাস থাকবে যেখানে একটি পয়েন্টার থাকবে যা একই ঠিকানার দিকে নির্দেশ করে।
যখন Testকোনওটি ধ্বংস হয়ে যায়, এটি পয়েন্টারটিকেও ধ্বংস করে দেয়। যখন আপনার দ্বিতীয়টি Testধ্বংস হয়ে যায়, এটি পয়েন্টারের পিছনে থাকা স্মৃতিটিকেও সরিয়ে দেওয়ার চেষ্টা করবে। তবে এটি ইতিমধ্যে মুছে ফেলা হয়েছে এবং আমরা কিছু খারাপ মেমরি অ্যাক্সেস রানটাইম ত্রুটি (বা আমরা দুর্ভাগ্যজনক হলে অপরিজ্ঞাত আচরণ) পাব।
সুতরাং, সঠিক উপায় হ'ল হয় কপি কন্সট্রাক্টর এবং কপি অ্যাসাইনমেন্ট অপারেটর বাস্তবায়ন করা, যাতে আচরণটি পরিষ্কার হয় এবং আমরা একটি অনুলিপি তৈরি করতে পারি।
unique_ptrআমাদের এখানে এগিয়ে পথ। এর অর্থগত অর্থ রয়েছে: " আমি আছি unique, সুতরাং আপনি কেবল আমাকে অনুলিপি করতে পারবেন না। " সুতরাং, এটি এখন অপারেটরদের হাতে হাতে প্রয়োগের ভুল থেকে আমাদের বাধা দেয়।
আপনি বিশেষ আচরণের জন্য অনুলিপি নির্মাণকারী এবং অনুলিপি নিয়োগের অপারেটরটিকে সংজ্ঞায়িত করতে পারেন এবং আপনার কোডটি কার্যকর করবে। তবে আপনি ঠিক, তাই (!), বাধ্য হয়ে তা করতে বাধ্য।
গল্পটির নৈতিকতা: সর্বদা unique_ptrএই জাতীয় পরিস্থিতিতে ব্যবহার করুন।