முக்கிய உள்ளடக்கத்திற்குச் செல்லவும்
தொகுதி 7 · பாடம் 1 இன் 2பாடத்திட்டத்தில் 15/18~12 min
தொகுதி பாடங்கள் (1/2)

std::unique_ptr மற்றும் std::shared_ptr

கிளாசிக்கல் C++ இல், new மற்றும் delete ஆபரேட்டர்களைப் பயன்படுத்தி கைமுறை நினைவக மேலாண்மை என்பது நினைவக கசிவுகள் (வளங்கள் வெளியிடப்படாதவை) அல்லது தொங்கும் சுட்டிகள் (டீலோகேட்டட் நினைவகத்தை சுட்டிக்காட்டும் சுட்டிகள்) போன்ற பிழைகளின் பொதுவான மூலமாகும்.

<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ஏற்றுகிறது…

ஒரு std::unique_ptr<int> என பெயரிடப்பட்ட ptr ஐ அறிவிக்கவும், அதை std::make_unique உடன் துவக்கவும், 42 மதிப்பை வைத்திருக்கவும். std::cout ஐப் பயன்படுத்தி ptr இன் dereferenced மதிப்பை அச்சிடவும்.

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

`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 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்