Middle
Kada u pametnim pokazivačima neće biti pozvan operator delete za objekat?
sobes.tech АИ
Одговор од АИ
Operacija delete za objekat koji je pod kontrolom pametnog pokazivača neće biti pozvana u sledećim slučajevima:
-
Za
std::shared_ptr: ako postoji bar još jedanshared_ptrkoji poseduje isti objekat. Brisanje se dešava samo kada broj referenci dostigne nulu. -
Za
std::weak_ptr: on ne poseduje objekat, već samo na njega ukazuje, padeletenije pozvan pri uništavanjuweak_ptr. -
Za
std::unique_ptr: ako je pokazivač prenesen ili pomeren, i trenutniunique_ptrviše ne poseduje objekat. -
Ako je pametni pokazivač kreiran sa prilagođenim deleterom koji ne poziva
delete(npr. oslobađa resurs na drugi način).
Primer sa std::shared_ptr:
#include <memory>
#include <iostream>
struct Foo {
~Foo() { std::cout << "Foo uništen\n"; }
};
int main() {
std::shared_ptr<Foo> sp1(new Foo());
{
std::shared_ptr<Foo> sp2 = sp1; // brojač referenci = 2
} // sp2 se uništava, brojač = 1, delete se ne poziva
// delete će biti pozvan samo kada i sp1 bude uništen
}
Ovde će delete biti pozvan tek nakon uništavanja poslednjeg shared_ptr.