Sobes.tech
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š jedan shared_ptr koji 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, pa delete nije pozvan pri uništavanju weak_ptr.

  • Za std::unique_ptr: ako je pokazivač prenesen ili pomeren, i trenutni unique_ptr viš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.