Junior
C++-те қандай ақылды көрсеткіштер бар?
sobes.tech AI
AI-дан жауап
std::unique_ptr, std::shared_ptr, std::weak_ptr.
-
std::unique_ptr:- Объектті эксклюзивті меншігі.
- Көшіруге болмайды, бірақ орын ауыстыруға болады (
std::move). - Объект автоматты түрде жойылады, шыққан кезде немесе
unique_ptrжойылғанда. - Жеңіл, сілтеме есептегішінің қосымша шығындары жоқ.
#include <memory> // unique_ptr құру std::unique_ptr<int> up1(new int(10)); // Меншікті ауыстыру std::unique_ptr<int> up2 = std::move(up1); // up1 енді nullptr // up2 объектті меншіктейді -
std::shared_ptr:- Объектті бірлесіп меншіктеу.
shared_ptrкөрсететін ресурстардың санын бақылау үшін сілтеме есептегішін пайдаланады.- Соңғы
shared_ptrжойылғанда объект жойылады. - Көшіруге және орын ауыстыруға болады.
- Сілтеме есептегішінің қосымша шығындары бар (әдетте бөлек бөлінеді).
- Циклдік сілтемелер пайда болуы мүмкін, бұл жады ағып кетулеріне әкеледі.
#include <memory> // shared_ptr құру std::shared_ptr<int> sp1 = std::make_shared<int>(20); // Меншікті көшіру std::shared_ptr<int> sp2 = sp1; // сілтеме есептегішін арттырады // sp1 және sp2 объектті меншіктейді -
std::weak_ptr:- Объектіге меншігі жоқ.
- Бір немесе бірнеше
shared_ptrбасқарған объектке "әлсіз" сілтеме ретінде қызмет етеді. shared_ptrарасындағы циклдік сілтемелерді болдырмау үшін пайдаланылады.- Объектіге сілтеме есептегішін арттырмайды.
- Объектіге қауіпсіз қол жеткізу үшін
lock()әдісі арқылыshared_ptr-ке айналдыру керек. Егер объект жойылған болса,lock()босshared_ptrқайтарады.
#include <memory> // shared_ptr құру std::shared_ptr<int> sp = std::make_shared<int>(30); // weak_ptr құру std::weak_ptr<int> wp = sp; // Объектіге тексеру және пайдалану if (auto shared_from_weak = wp.lock()) { // Объектіге қол жеткізу } else { // Объект жойылған }