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

std::weak_ptr

যদিও std::shared_ptr অত্যন্ত দরকারী, শুধুমাত্র শেয়ার্ড মালিকানার উপর নির্ভর করা একটি বৃত্তাকার রেফারেন্স (বা চক্রাকার নির্ভরতা) নামে পরিচিত একটি সমস্যা হতে পারে।

যদি দুই বা ততোধিক বস্তুর প্রতিটিতে একটি shared_ptr থাকে অন্যটির দিকে নির্দেশ করে, একটি বন্ধ লুপ তৈরি হয়। এই পরিস্থিতিতে, কোনো বস্তুর রেফারেন্স গণনা কখনোই শূন্যে পৌঁছাবে না, ডিলোকেশন প্রতিরোধ করে এবং মেমরি লিক হতে পারে।

std::weak_ptr কি

মালিকানা চক্র ভাঙতে, স্ট্যান্ডার্ড লাইব্রেরি std::weak_ptr অফার করে। এটি একটি স্মার্ট পয়েন্টার যা একটি shared_ptr দ্বারা পরিচালিত একটি বস্তু পর্যবেক্ষণ করে, কিন্তু রেফারেন্স সংখ্যা বৃদ্ধি না করে।

এটি সরাসরি সম্পদের মালিক নয়, তাই এটি তার ধ্বংস রোধ করে না।

C++
#include <memory>

std::shared_ptr<int> shared = std::make_shared<int>(42);
std::weak_ptr<int> weak = shared; // Does not increment reference count!

সম্পদ যাচাই এবং অ্যাক্সেস

যেহেতু একটি weak_ptr সম্পদের মালিক নয়, সম্পদটি যে কোনো সময় ডিললোকেট করা যেতে পারে (যখন সমস্ত সংশ্লিষ্ট shared_ptr দৃষ্টান্ত সুযোগের বাইরে চলে যায়)।

পর্যবেক্ষণ করা সম্পদ ব্যবহার করতে, আমাদের অবশ্যই:

  1. expired() ব্যবহার করে এটি এখনও বৈধ কিনা তা পরীক্ষা করুন৷
  2. lock() পদ্ধতি ব্যবহার করে অস্থায়ীভাবে weak_ptr কে একটি shared_ptr এ রূপান্তর করুন। যদি সংস্থানটি এখনও সক্রিয় থাকে, lock() একটি বৈধ shared_ptr প্রদান করে, অন্যথায় এটি একটি নাল পয়েন্টার (nullptr) প্রদান করে।
C++
if (!weak.expired()) {
    // lock() creates a temporary shared_ptr to ensure safe access
    if (std::shared_ptr<int> sharedAccess = weak.lock()) {
        std::cout << *sharedAccess << std::endl;
    }
} else {
    std::cout << "Resource deallocated!" << std::endl;
}

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

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

sPtr থেকে শুরু করা wPtr নামের একটি std::weak_ptr<int> ঘোষণা করুন। তারপর std::cout ব্যবহার করে wPtr.expired() দ্বারা ফেরত বুলিয়ান ফলাফল প্রিন্ট করুন।

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

একই জেনেরিক টাইপ `<int>` নির্দেশ করে `weak_ptr` ঘোষণা করুন এবং সরাসরি `sPtr` বরাদ্দ করুন।

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

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

একটি অস্থায়ী শেয়ার্ড_পিটিআর পেতে wPtr-এ lock() পদ্ধতি ব্যবহার করুন। যদি অপারেশন সফল হয় (পয়েন্টারটি নাল নয়), ডিরেফারেন্সড মান প্রিন্ট করুন।

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

`wPtr.lock()` কল করে একটি `if` ব্লকের মধ্যে একটি ভেরিয়েবল শুরু করুন, তারপর তারকাচিহ্নের সাহায্যে রিসোর্সটিকে প্রিন্ট করুন `*` দিয়ে।

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