Junior
223
Koji pametni pokazivači postoje u C++?
Одговор од АИ
sobes.tech АИ
std::unique_ptr, std::shared_ptr, std::weak_ptr.
-
std::unique_ptr:- Ekskluzivno vlasništvo nad objektom.
- Ne može se kopirati, ali se može premjestiti (
std::move). - Automatski briše objekt pri izlasku iz opsega ili uništenju
unique_ptr. - Lagana je, bez dodatnih troškova za brojač referenci.
#include <memory> // Kreiranje unique_ptr std::unique_ptr<int> up1(new int(10)); // Premještanje vlasništva std::unique_ptr<int> up2 = std::move(up1); // up1 sada je nullptr // up2 posjeduje objekt -
std::shared_ptr:- Dijeljeno vlasništvo nad objektom.
- Koristi brojač referenci za praćenje koliko
shared_ptrpokazuje na resurs. - Objekat se briše kada posljednji
shared_ptrkoji ga pokazuje bude uništen. - Može se kopirati i premjestiti.
- Ima dodatne troškove za brojač referenci (obično odvojeno alociran).
- Može formirati ciklične reference, što dovodi do curenja memorije.
#include <memory> // Kreiranje shared_ptr std::shared_ptr<int> sp1 = std::make_shared<int>(20); // Kopiranje vlasništva std::shared_ptr<int> sp2 = sp1; // Brojač referenci se povećava // sp1 i sp2 posjeduju objekt -
std::weak_ptr:- Ne posjeduje objekt.
- Predstavlja "slabu" referencu na objekt, upravljanu od strane jednog ili više
shared_ptr. - Koristi se za sprječavanje cikličkih referenci između
shared_ptr. - Ne povećava brojač referenci objekta.
- Za siguran pristup objektu, potrebno ga je pretvoriti u
shared_ptrpomoću metodelock(). Ako je objekt već izbrisan,lock()će vratiti prazanshared_ptr.
#include <memory> // Kreiranje shared_ptr std::shared_ptr<int> sp = std::make_shared<int>(30); // Kreiranje weak_ptr od shared_ptr std::weak_ptr<int> wp = sp; // Provjera i korištenje objekta if (auto shared_from_weak = wp.lock()) { // Pristup objektu putem shared_from_weak } else { // Objekt je već izbrisan }