মডিউল পাঠ (1/2)
std::unique_ptr এবং std::shared_ptr
ধ্রুপদী C++-এ, new এবং delete অপারেটর ব্যবহার করে ম্যানুয়াল মেমরি ম্যানেজমেন্ট হল ত্রুটির একটি সাধারণ উৎস যেমন মেমরি লিক (সম্পদ কখনও প্রকাশ করা হয় না) বা ঝুলানো পয়েন্টার (পয়েন্টারগুলি ডিলকেটেড মেমরির দিকে নির্দেশ করে)।
আধুনিক C++ স্মার্ট পয়েন্টার প্রবর্তন করে, যা <memory> হেডারে সংজ্ঞায়িত করা হয়েছে। তারা স্বয়ংক্রিয়ভাবে RAII (রিসোর্স অ্যাকুইজিশন ইজ ইনিশিয়ালাইজেশন) ব্যবহার করে হিপ-অ্যালোকেটেড মেমরির জীবনচক্র পরিচালনা করে, যখন স্মার্ট পয়েন্টার সুযোগের বাইরে চলে যায় তখন রিসোর্স ডিলকেটিং করে।
std::unique_ptr
std::unique_ptr একটি সম্পদের একচেটিয়া মালিকানা ধারণা বাস্তবায়ন করে। এটি অনুলিপি করা যাবে না, শুধুমাত্র সরানো যাবে (std::move এর মাধ্যমে)।
#include <memory>
// Recommended creation using std::make_unique (C++14)
std::unique_ptr<int> p1 = std::make_unique<int>(42);
// Accessing the resource like a normal pointer
std::cout << *p1 << std::endl;
// std::unique_ptr<int> p2 = p1; // COMPILER ERROR: copy not allowed!
std::unique_ptr<int> p2 = std::move(p1); // Allowed: p1 transfers ownership to p2std::shared_ptr
std::shared_ptr শেয়ার করা মালিকানা ধারণা বাস্তবায়ন করে। একাধিক স্মার্ট পয়েন্টার একই সংস্থান নির্দেশ করতে পারে। ক্লাসটি অভ্যন্তরীণভাবে একটি রেফারেন্স গণনা বজায় রাখে: মেমরিটি কেবল তখনই মুক্ত হয় যখন শেষ সক্রিয় shared_ptr ধ্বংস বা পুনরায় সেট করা হয়।
#include <memory>
std::shared_ptr<int> s1 = std::make_shared<int>(100);
std::shared_ptr<int> s2 = s1; // Allowed: increments the reference count
std::cout << s1.use_count() << std::endl; // Prints 2 (s1 and s2 share the resource)নিজে চেষ্টা করে দেখুন
ptr নামের একটি std::unique_ptr<int> ঘোষণা করুন, এটিকে শুরু করে std::make_unique মান 42 ধরে রাখুন। std::cout ব্যবহার করে ptr-এর ডিরেফারেন্সড মান প্রিন্ট করুন।
ইঙ্গিত দেখান
`std::unique_ptr<int> ptr = std::make_unique<int>(42);` ব্যবহার করুন এবং তারপর আউটপুট স্ট্রীমে `*ptr` পাঠান।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
std::make_shared ব্যবহার করে 100 মান সহ ptr1 নামের একটি std::shared_ptr<int> ইনস্ট্যান্টিয়েট করুন। ptr2 নামে একটি অনুলিপি তৈরি করুন এবং std::cout ব্যবহার করে ptr1.use_count() দ্বারা প্রত্যাবর্তিত মানটি প্রিন্ট করুন।
ইঙ্গিত দেখান
কপি করা স্ট্যান্ডার্ড অ্যাসাইনমেন্টের মাধ্যমে করা হয়: `ptr2 = ptr1;`। `ptr1.use_count()` মুদ্রণ 2 প্রদর্শন করা উচিত।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ