এর unique_ptr<T>নির্মাতা প্রকারের কোনও বস্তুতে কাঁচা পয়েন্টার গ্রহণ করে T(সুতরাং এটি গ্রহণ করে T*)।
প্রথম উদাহরণে:
unique_ptr<int> uptr (new int(3));
পয়েন্টারটি একটি newঅভিব্যক্তির ফলাফল , যখন দ্বিতীয় উদাহরণে:
unique_ptr<double> uptr2 (pd);
পয়েন্টারটি pdভেরিয়েবলে সংরক্ষণ করা হয় ।
ধারণাগতভাবে, কোনও পরিবর্তন হয় না (আপনি unique_ptrএকটি কাঁচা পয়েন্টার থেকে একটি নির্মাণ করছেন ), তবে দ্বিতীয় পদ্ধতিটি সম্ভবত আরও বিপজ্জনক, যেহেতু এটি আপনাকে উদাহরণস্বরূপ করার অনুমতি দেয়:
unique_ptr<double> uptr2 (pd);
unique_ptr<double> uptr3 (pd);
সুতরাং দুটি অনন্য পয়েন্টার রয়েছে যা কার্যকরভাবে একই বস্তুকে আবদ্ধ করে তোলে (এইভাবে একটি অনন্য পয়েন্টারের শব্দার্থ লঙ্ঘন )।
এ কারণেই যখন সম্ভব হয় তখন অনন্য পয়েন্টার তৈরির জন্য প্রথম ফর্মটি আরও ভাল। লক্ষ্য করুন, C ++ 14 এ আমরা সক্ষম হব:
unique_ptr<int> p = make_unique<int>(42);
যা পরিষ্কার এবং নিরাপদ উভয়ই। আপনার এই সন্দেহ সম্পর্কে:
আমার কাছে যা স্পষ্ট নয়, পয়েন্টারগুলি কীভাবে এইভাবে ঘোষিত হয়েছে এটি একটি "সাধারণ" উপায়ে ঘোষিত পয়েন্টার থেকে আলাদা হবে।
স্মার্ট পয়েন্টারগুলি অবজেক্টের মালিকানার মডেল করার কথা বলে এবং স্বয়ংক্রিয়ভাবে পয়েন্টারটি যখন অবজেক্টের সর্বশেষ (স্মার্ট, মালিকানাধীন) পয়েন্টারটি সুযোগের বাইরে চলে যায় তখন বিন্দু বস্তুটি ধ্বংস করার যত্ন নেয় care
এইভাবে আপনাকে deleteগতিশীলভাবে বরাদ্দকৃত বস্তুগুলিতে করা মনে রাখবেন না - স্মার্ট পয়েন্টারটির ধ্বংসকারী এটি আপনার জন্য করবেন - বা ইতিমধ্যে ধ্বংস হওয়া কোনও বস্তুর প্রতি আপনি (ঝুঁকিপূর্ণ) পয়েন্টারকে অবজ্ঞাপূর্ণ করবেন না কিনা তা নিয়ে চিন্তা করতে হবে:
{
unique_ptr<int> p = make_unique<int>(42);
}
এখন unique_ptrএকটি স্মার্ট পয়েন্টার যা অনন্য মালিকানার মডেল করে, এর অর্থ হল যে আপনার প্রোগ্রামে যে কোনও সময় পয়েন্ট পয়েন্টটির জন্য কেবলমাত্র একটি (মালিকানাধীন) পয়েন্টার থাকতে পারে - এজন্যই unique_ptrঅনুলিপিযোগ্য নয়।
যতক্ষণ আপনি স্মার্ট পয়েন্টারগুলি এমনভাবে ব্যবহার করেন যা আপনার মেনে চলার জন্য জড়িত চুক্তিটি ভঙ্গ করে না, আপনার গ্যারান্টি থাকবে যে কোনও স্মৃতি ফাঁস হবে না এবং আপনার অবজেক্টের জন্য যথাযথ মালিকানা নীতি কার্যকর করা হবে। কাঁচা পয়েন্টারগুলি আপনাকে এই গ্যারান্টি দেয় না।
new int(3)নতুনকে একটি পয়েন্টার দেয়int, ঠিক যেমনটিpdনতুনের জন্য একটি পয়েন্টার ছিলdouble।