ప్రధాన కంటెంట్‌కు వెళ్లండి
మాడ్యూల్ 7 · 2లో పాఠం 1కోర్సులో 15/18~12 min
మాడ్యూల్ పాఠాలు (1/2)

std::unique_ptr మరియు std::shared_ptr

క్లాసికల్ C++లో, new మరియు delete ఆపరేటర్‌లను ఉపయోగించి మాన్యువల్ మెమరీ నిర్వహణ అనేది మెమరీ లీక్‌లు (వనరులు ఎప్పుడూ విడుదల చేయబడలేదు) లేదా డాంగ్లింగ్ పాయింటర్‌లు (డీలోకేట్ చేసిన మెమరీని సూచించే పాయింటర్లు) వంటి బగ్‌ల యొక్క సాధారణ మూలం.

ఆధునిక C++ <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లోడ్ అవుతోంది...

ptr పేరుతో ఒక std::unique_ptr<int>ని ప్రకటించండి, దానిని 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 ప్రయత్నాల తర్వాత పరిష్కారం లభిస్తుంది