Quand dans les pointeurs intelligents, l'opérateur delete ne sera pas appelé pour l'objet?
sobes.tech IA
Réponse de l'IA
L'opération delete pour un objet géré par un pointeur intelligent ne sera pas appelée dans les cas suivants :
-
Pour
std::shared_ptr: s'il existe au moins un autreshared_ptrpossédant le même objet. La suppression ne se produit que lorsque le compteur de références atteint zéro. -
Pour
std::weak_ptr: il ne possède pas l'objet, il ne fait que le référencer, doncdeleten'est pas appelé lors de la destruction duweak_ptr. -
Pour
std::unique_ptr: si le pointeur a été transféré ou déplacé, et que leunique_ptractuel ne possède plus l'objet. -
Si le pointeur intelligent a été créé avec un déliteur personnalisé qui n'appelle pas
delete(par exemple, libère la ressource autrement).
Exemple avec std::shared_ptr :
#include <memory>
#include <iostream>
struct Foo {
~Foo() { std::cout << "Foo détruit\n"; }
};
int main() {
std::shared_ptr<Foo> sp1(new Foo());
{
std::shared_ptr<Foo> sp2 = sp1; // compteur de références = 2
} // sp2 est détruit, compteur = 1, delete n'est pas appelé
// delete ne sera appelé que lorsque sp1 sera également détruit
}
Ici, delete ne sera appelé qu'après la destruction du dernier shared_ptr.