মূল কন্টেন্টে যান
মডিউল 7 · 1-এর পাঠ 2কোর্সে 15/18~12 min
মডিউল পাঠ (1/2)

std::unique_ptr এবং std::shared_ptr

ধ্রুপদী C++-এ, new এবং delete অপারেটর ব্যবহার করে ম্যানুয়াল মেমরি ম্যানেজমেন্ট হল ত্রুটির একটি সাধারণ উৎস যেমন মেমরি লিক (সম্পদ কখনও প্রকাশ করা হয় না) বা ঝুলানো পয়েন্টার (পয়েন্টারগুলি ডিলকেটেড মেমরির দিকে নির্দেশ করে)।

আধুনিক C++ স্মার্ট পয়েন্টার প্রবর্তন করে, যা <memory> হেডারে সংজ্ঞায়িত করা হয়েছে। তারা স্বয়ংক্রিয়ভাবে RAII (রিসোর্স অ্যাকুইজিশন ইজ ইনিশিয়ালাইজেশন) ব্যবহার করে হিপ-অ্যালোকেটেড মেমরির জীবনচক্র পরিচালনা করে, যখন স্মার্ট পয়েন্টার সুযোগের বাইরে চলে যায় তখন রিসোর্স ডিলকেটিং করে।

std::unique_ptr

std::unique_ptr একটি সম্পদের একচেটিয়া মালিকানা ধারণা বাস্তবায়ন করে। এটি অনুলিপি করা যাবে না, শুধুমাত্র সরানো যাবে (std::move এর মাধ্যমে)।

C++
#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 p2

std::shared_ptr

std::shared_ptr শেয়ার করা মালিকানা ধারণা বাস্তবায়ন করে। একাধিক স্মার্ট পয়েন্টার একই সংস্থান নির্দেশ করতে পারে। ক্লাসটি অভ্যন্তরীণভাবে একটি রেফারেন্স গণনা বজায় রাখে: মেমরিটি কেবল তখনই মুক্ত হয় যখন শেষ সক্রিয় shared_ptr ধ্বংস বা পুনরায় সেট করা হয়।

C++
#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)

নিজে চেষ্টা করে দেখুন

ব্যায়াম#cpp.m7.l1.e1
প্রচেষ্টা: 0লোড হচ্ছে...

ptr নামের একটি std::unique_ptr<int> ঘোষণা করুন, এটিকে শুরু করে std::make_unique মান 42 ধরে রাখুন। std::cout ব্যবহার করে ptr-এর ডিরেফারেন্সড মান প্রিন্ট করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

`std::unique_ptr<int> ptr = std::make_unique<int>(42);` ব্যবহার করুন এবং তারপর আউটপুট স্ট্রীমে `*ptr` পাঠান।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ

ব্যায়াম#cpp.m7.l1.e2
প্রচেষ্টা: 0লোড হচ্ছে...

std::make_shared ব্যবহার করে 100 মান সহ ptr1 নামের একটি std::shared_ptr<int> ইনস্ট্যান্টিয়েট করুন। ptr2 নামে একটি অনুলিপি তৈরি করুন এবং std::cout ব্যবহার করে ptr1.use_count() দ্বারা প্রত্যাবর্তিত মানটি প্রিন্ট করুন।

সম্পাদক লোড হচ্ছে...
ইঙ্গিত দেখান

কপি করা স্ট্যান্ডার্ড অ্যাসাইনমেন্টের মাধ্যমে করা হয়: `ptr2 = ptr1;`। `ptr1.use_count()` মুদ্রণ 2 প্রদর্শন করা উচিত।

সমাধান 3 প্রচেষ্টার পরে উপলব্ধ