মডিউল পাঠ (2/2)
std::weak_ptr
যদিও std::shared_ptr অত্যন্ত দরকারী, শুধুমাত্র শেয়ার্ড মালিকানার উপর নির্ভর করা একটি বৃত্তাকার রেফারেন্স (বা চক্রাকার নির্ভরতা) নামে পরিচিত একটি সমস্যা হতে পারে।
যদি দুই বা ততোধিক বস্তুর প্রতিটিতে একটি shared_ptr থাকে অন্যটির দিকে নির্দেশ করে, একটি বন্ধ লুপ তৈরি হয়। এই পরিস্থিতিতে, কোনো বস্তুর রেফারেন্স গণনা কখনোই শূন্যে পৌঁছাবে না, ডিলোকেশন প্রতিরোধ করে এবং মেমরি লিক হতে পারে।
std::weak_ptr কি
মালিকানা চক্র ভাঙতে, স্ট্যান্ডার্ড লাইব্রেরি std::weak_ptr অফার করে। এটি একটি স্মার্ট পয়েন্টার যা একটি shared_ptr দ্বারা পরিচালিত একটি বস্তু পর্যবেক্ষণ করে, কিন্তু রেফারেন্স সংখ্যা বৃদ্ধি না করে।
এটি সরাসরি সম্পদের মালিক নয়, তাই এটি তার ধ্বংস রোধ করে না।
#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 দৃষ্টান্ত সুযোগের বাইরে চলে যায়)।
পর্যবেক্ষণ করা সম্পদ ব্যবহার করতে, আমাদের অবশ্যই:
expired()ব্যবহার করে এটি এখনও বৈধ কিনা তা পরীক্ষা করুন৷lock()পদ্ধতি ব্যবহার করে অস্থায়ীভাবেweak_ptrকে একটিshared_ptrএ রূপান্তর করুন। যদি সংস্থানটি এখনও সক্রিয় থাকে,lock()একটি বৈধshared_ptrপ্রদান করে, অন্যথায় এটি একটি নাল পয়েন্টার (nullptr) প্রদান করে।
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;
}নিজে চেষ্টা করে দেখুন
sPtr থেকে শুরু করা wPtr নামের একটি std::weak_ptr<int> ঘোষণা করুন। তারপর std::cout ব্যবহার করে wPtr.expired() দ্বারা ফেরত বুলিয়ান ফলাফল প্রিন্ট করুন।
ইঙ্গিত দেখান
একই জেনেরিক টাইপ `<int>` নির্দেশ করে `weak_ptr` ঘোষণা করুন এবং সরাসরি `sPtr` বরাদ্দ করুন।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ
একটি অস্থায়ী শেয়ার্ড_পিটিআর পেতে wPtr-এ lock() পদ্ধতি ব্যবহার করুন। যদি অপারেশন সফল হয় (পয়েন্টারটি নাল নয়), ডিরেফারেন্সড মান প্রিন্ট করুন।
ইঙ্গিত দেখান
`wPtr.lock()` কল করে একটি `if` ব্লকের মধ্যে একটি ভেরিয়েবল শুরু করুন, তারপর তারকাচিহ্নের সাহায্যে রিসোর্সটিকে প্রিন্ট করুন `*` দিয়ে।
সমাধান 3 প্রচেষ্টার পরে উপলব্ধ