Sobes.tech
Middle

Kiedy w inteligentnych wskaźnikach nie zostanie wywołany operator delete dla obiektu?

sobes.tech AI

Odpowiedź od AI

Operacja delete dla obiektu zarządzanego przez inteligentny wskaźnik nie zostanie wywołana w następujących przypadkach:

  • Dla std::shared_ptr: jeśli istnieje co najmniej inny shared_ptr posiadający ten sam obiekt. Usunięcie następuje tylko wtedy, gdy licznik odwołań osiągnie zero.

  • Dla std::weak_ptr: nie posiada obiektu, a jedynie na niego wskazuje, więc delete nie jest wywoływane podczas niszczenia weak_ptr.

  • Dla std::unique_ptr: jeśli wskaźnik został przekazany lub przeniesiony, a obecny unique_ptr nie posiada już obiektu.

  • Jeśli inteligentny wskaźnik został utworzony z niestandardowym deleterem, który nie wywołuje delete (np. zwalnia zasób w inny sposób).

Przykład z std::shared_ptr:

#include <memory>
#include <iostream>

struct Foo {
    ~Foo() { std::cout << "Foo zniszczony\n"; }
};

int main() {
    std::shared_ptr<Foo> sp1(new Foo());
    {
        std::shared_ptr<Foo> sp2 = sp1; // licznik odwołań = 2
    } // sp2 jest niszczony, licznik = 1, delete nie jest wywoływane
    // delete zostanie wywołane tylko gdy sp1 również zostanie zniszczony
}

Tutaj delete zostanie wywołane tylko po zniszczeniu ostatniego shared_ptr.