Sobes.tech
Middle

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 autre shared_ptr possé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, donc delete n'est pas appelé lors de la destruction du weak_ptr.

  • Pour std::unique_ptr : si le pointeur a été transféré ou déplacé, et que le unique_ptr actuel 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.