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 altroshared_ptrche 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, quindideletenon viene chiamato durante la distruzione delweak_ptr. -
Per
std::unique_ptr: se il puntatore è stato trasferito o spostato, e l'attualeunique_ptrnon 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.