Junior
Aké sú inteligentné ukazovatele v C++?
sobes.tech AI
Odpoveď od AI
std::unique_ptr, std::shared_ptr, std::weak_ptr.
-
std::unique_ptr:- Výhradné vlastníctvo objektu.
- Nemôže byť kopírovaný, ale môže byť presunutý (
std::move). - Automaticky odstráni objekt pri opustení rozsahu alebo zničení
unique_ptr. - Je ľahký, bez dodatočných nákladov na čítač odkazov.
#include <memory> // Vytvorenie unique_ptr std::unique_ptr<int> up1(new int(10)); // Presun vlastníctva std::unique_ptr<int> up2 = std::move(up1); // up1 je teraz nullptr // up2 vlastní objekt -
std::shared_ptr:- Zdieľané vlastníctvo objektu.
- Používa čítač odkazov na sledovanie, koľko
shared_ptrukazuje na zdroj. - Objekt je odstránený, keď posledný
shared_ptr, ktorý naň odkazuje, je zničený. - Môže byť kopírovaný a presunutý.
- Má dodatočné náklady na čítač odkazov (zvyčajne samostatne alokovaný).
- Môže tvoriť cyklické odkazy, čo vedie k únikom pamäte.
#include <memory> // Vytvorenie shared_ptr std::shared_ptr<int> sp1 = std::make_shared<int>(20); // Kopírovanie vlastníctva std::shared_ptr<int> sp2 = sp1; // Čítač odkazov sa zvyšuje // sp1 a sp2 vlastnia objekt -
std::weak_ptr:- Nevlastní objekt.
- Predstavuje "slabú" referenciu na objekt, spravovanú jedným alebo viacerými
shared_ptr. - Používa sa na prevenciu cyklických odkazov medzi
shared_ptr. - Nezvyšuje čítač odkazov objektu.
- Pre bezpečný prístup k objektu je potrebné ho konvertovať na
shared_ptrpomocou metódylock(). Ak bol objekt už odstránený,lock()vráti prázdnyshared_ptr.
#include <memory> // Vytvorenie shared_ptr std::shared_ptr<int> sp = std::make_shared<int>(30); // Vytvorenie weak_ptr z shared_ptr std::weak_ptr<int> wp = sp; // Kontrola a použitie objektu if (auto shared_from_weak = wp.lock()) { // Prístup k objektu cez shared_from_weak } else { // Objekt už bol odstránený }