தொகுதி பாடங்கள் (1/2)
std::unique_ptr மற்றும் std::shared_ptr
கிளாசிக்கல் C++ இல், new மற்றும் delete ஆபரேட்டர்களைப் பயன்படுத்தி கைமுறை நினைவக மேலாண்மை என்பது நினைவக கசிவுகள் (வளங்கள் வெளியிடப்படாதவை) அல்லது தொங்கும் சுட்டிகள் (டீலோகேட்டட் நினைவகத்தை சுட்டிக்காட்டும் சுட்டிகள்) போன்ற பிழைகளின் பொதுவான மூலமாகும்.
<memory> தலைப்பில் வரையறுக்கப்பட்ட ஸ்மார்ட் பாயிண்டர்களை நவீன சி++ அறிமுகப்படுத்துகிறது. அவை RAII (ஆதார கையகப்படுத்தல் என்பது துவக்கம்) ஐப் பயன்படுத்தி குவியலாக ஒதுக்கப்பட்ட நினைவகத்தின் வாழ்க்கைச் சுழற்சியை தானாகவே நிர்வகிக்கிறது, ஸ்மார்ட் பாயிண்டர் ஸ்கோப் இல்லாமல் போகும் போது வளத்தை ஒதுக்குகிறது.
std::unique_ptr
std::unique_ptr ஒரு வளத்தின் பிரத்தியேக உரிமை என்ற கருத்தை செயல்படுத்துகிறது. அதை நகலெடுக்க முடியாது, நகர்த்த மட்டுமே (std::move வழியாக).
#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 p2std::shared_ptr
std::shared_ptr பகிரப்பட்ட உரிமை என்ற கருத்தை செயல்படுத்துகிறது. பல ஸ்மார்ட் சுட்டிகள் ஒரே ஆதாரத்தை சுட்டிக்காட்டலாம். வகுப்பு உள்நாட்டில் ஒரு குறிப்பு எண்ணிக்கையை பராமரிக்கிறது: கடைசியாக செயலில் உள்ள shared_ptr அழிக்கப்பட்டால் அல்லது மீட்டமைக்கப்படும் போது மட்டுமே நினைவகம் விடுவிக்கப்படும்.
#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)நீங்களே முயற்சி செய்து பாருங்கள்
ஒரு 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 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்
std::make_shared ஐப் பயன்படுத்தி 100 மதிப்புடன் ptr1 என்ற பெயரிடப்பட்ட std::shared_ptr<int> ஐ உடனடியாகச் செய்யவும். ptr2 என்ற நகலை உருவாக்கி, std::cout ஐப் பயன்படுத்தி ptr1.use_count() மூலம் வழங்கப்பட்ட மதிப்பை அச்சிடவும்.
குறிப்பைக் காட்டு
நிலையான ஒதுக்கீட்டின் மூலம் நகலெடுக்கப்படுகிறது: `ptr2 = ptr1;`. `ptr1.use_count()` அச்சிடுதல் 2ஐக் காட்ட வேண்டும்.
3 முயற்சிகளுக்குப் பிறகு தீர்வு கிடைக்கும்