Sobes.tech
Middle

Când nu va fi apelat operatorul delete pentru un obiect în pointerii inteligenți?

sobes.tech AI

Răspuns de la AI

Operațiunea delete pentru un obiect gestionat de un pointer inteligent nu va fi apelată în următoarele cazuri:

  • Pentru std::shared_ptr: dacă există cel puțin un alt shared_ptr care deține același obiect. Ștergerea are loc doar atunci când contorul de referințe ajunge la zero.

  • Pentru std::weak_ptr: nu deține obiectul, ci doar face referire la el, așa că delete nu este apelat la distrugerea weak_ptr.

  • Pentru std::unique_ptr: dacă pointerul a fost transferat sau mutat, iar unique_ptr curent nu mai deține obiectul.

  • Dacă pointerul inteligent a fost creat cu un deleter personalizat care nu apelează delete (de exemplu, eliberează resursa în alt mod).

Exemplu cu std::shared_ptr:

#include <memory>
#include <iostream>

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

int main() {
    std::shared_ptr<Foo> sp1(new Foo());
    {
        std::shared_ptr<Foo> sp2 = sp1; // contor de referințe = 2
    } // sp2 este distrus, contor = 1, delete nu este apelat
    // delete va fi apelat doar când sp1 va fi de asemenea distrus
}

Aici, delete va fi apelat doar după distrugerea ultimului shared_ptr.