Sobes.tech
Middle

Wanneer wordt de delete-operator niet aangeroepen voor een object in slimme pointers?

sobes.tech AI

Antwoord van AI

De delete-operatie voor een door een slimme pointer beheerd object wordt niet aangeroepen in de volgende gevallen:

  • Voor std::shared_ptr: als er minstens een andere shared_ptr bestaat die hetzelfde object bezit. Verwijdering gebeurt alleen wanneer de referentieteller op nul staat.

  • Voor std::weak_ptr: het bezit het object niet, maar verwijst er alleen naar, dus delete wordt niet aangeroepen bij het vernietigen van de weak_ptr.

  • Voor std::unique_ptr: als de pointer is overgedragen of verplaatst, en de huidige unique_ptr het object niet meer bezit.

  • Als de slimme pointer is gemaakt met een aangepaste deleter die delete niet aanroept (bijvoorbeeld, de resource op een andere manier vrijmaakt).

Voorbeeld met std::shared_ptr:

#include <memory>
#include <iostream>

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

int main() {
    std::shared_ptr<Foo> sp1(new Foo());
    {
        std::shared_ptr<Foo> sp2 = sp1; // referentieteller = 2
    } // sp2 wordt vernietigd, teller = 1, delete wordt niet aangeroepen
    // delete wordt alleen aangeroepen wanneer sp1 ook wordt vernietigd
}

Hier wordt delete alleen aangeroepen nadat de laatste shared_ptr is vernietigd.