Sobes.tech
Middle

Quando nei puntatori intelligenti l'operatore delete non verrà chiamato per l'oggetto?

sobes.tech AI

Risposta dell'AI

L'operazione delete per un oggetto gestito da un puntatore intelligente non verrà chiamata nei seguenti casi:

  • Per std::shared_ptr: se esiste almeno un altro shared_ptr che possiede lo stesso oggetto. La cancellazione avviene solo quando il contatore di riferimenti raggiunge zero.

  • Per std::weak_ptr: non possiede l'oggetto, ma solo lo riferisce, quindi delete non viene chiamato durante la distruzione del weak_ptr.

  • Per std::unique_ptr: se il puntatore è stato trasferito o spostato, e l'attuale unique_ptr non possiede più l'oggetto.

  • Se il puntatore intelligente è stato creato con un deleter personalizzato che non chiama delete (ad esempio, rilascia la risorsa in altro modo).

Esempio con std::shared_ptr:

#include <memory>
#include <iostream>

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

int main() {
    std::shared_ptr<Foo> sp1(new Foo());
    {
        std::shared_ptr<Foo> sp2 = sp1; // contatore di riferimenti = 2
    } // sp2 viene distrutto, contatore = 1, delete non viene chiamato
    // delete verrà chiamato solo quando anche sp1 sarà distrutto
}

Qui, delete verrà chiamato solo dopo che l'ultimo shared_ptr sarà distrutto.