Junior
222
Kokie yra išmanieji rodyklės C++?
Atsakymas iš AI
sobes.tech AI
std::unique_ptr, std::shared_ptr, std::weak_ptr.
-
std::unique_ptr:- Išskirtinė objekto nuosavybė.
- Negali būti kopijuotas, bet gali būti perkeliamas (
std::move). - Automatiškai ištrina objektą išeinant iš matymo srities arba sunaikinant
unique_ptr. - Lengvas, neturi papildomų išlaidų nuorodų skaitiklio.
#include <memory> // `unique_ptr` sukūrimas std::unique_ptr<int> up1(new int(10)); // Nuosavybės perkėlimas std::unique_ptr<int> up2 = std::move(up1); // up1 dabar nullptr // up2 valdo objektą -
std::shared_ptr:- Bendras objekto valdymas.
- Naudoja nuorodų skaitiklį, stebintį, kiek
shared_ptrnurodo į išteklių. - Objektas ištrinamas, kai paskutinis
shared_ptrjį sunaikina. - Gali būti kopijuojamas ir perkeltas.
- Turi papildomas išlaidas nuorodų skaitikliui (paprastai atskirai priskiriama).
- Gali atsirasti ciklinės nuorodos, kurios sukelia atminties nutekėjimą.
#include <memory> // `shared_ptr` sukūrimas std::shared_ptr<int> sp1 = std::make_shared<int>(20); // Nuosavybės kopijavimas std::shared_ptr<int> sp2 = sp1; // Nuorodų skaitiklis didėja // sp1 ir sp2 valdo objektą -
std::weak_ptr:- Nevaldo objekto.
- Atstovauja "silpną" nuorodą į objektą, kurį valdo vienas ar keli
shared_ptr. - Naudojama ciklinių nuorodų prevencijai tarp
shared_ptr. - Nepadidina nuorodų skaitiklio.
- Norint saugiai pasiekti objektą, reikia paversti į
shared_ptrnaudojantlock()metodą. Jei objektas jau ištrintas,lock()grąžins tuščiąshared_ptr.
#include <memory> // `shared_ptr` sukūrimas std::shared_ptr<int> sp = std::make_shared<int>(30); // `weak_ptr` sukūrimas iš `shared_ptr` std::weak_ptr<int> wp = sp; // Patikrinimas ir naudojimas if (auto shared_from_weak = wp.lock()) { // Pasiekti objektą per shared_from_weak } else { // Objekto jau nėra }