முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 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ஏற்றுகிறது…

தற்காலிக பகிரப்பட்ட_ptr ஐப் பெற wPtr இல் பூட்டு() முறையைப் பயன்படுத்தவும். செயல்பாடு வெற்றியடைந்தால் (சுட்டி பூஜ்யமாக இல்லை), குறிப்பிடப்பட்ட மதிப்பை அச்சிடவும்.

எடிட்டரை ஏற்றுகிறது…
குறிப்பைக் காட்டு

`wPtr.lock()` என அழைப்பதன் மூலம் `if` தொகுதிக்குள் ஒரு மாறியைத் துவக்கவும், பின்னர் அதை `*` என்ற நட்சத்திரக் குறியுடன் குறிவைத்து ஆதாரத்தை அச்சிடவும்.

3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்