Sobes.tech
Middle

Mikor nem hívódik meg a delete operátor az okos mutatókon egy objektum esetén?

sobes.tech MI

Válasz az MI-től

Az intelligens mutató által kezelt objektum delete művelete a következő esetekben nem kerül meghívásra:

  • std::shared_ptr esetén: ha van legalább egy másik shared_ptr, amely ugyanazt az objektumot birtokolja. A törlés csak akkor történik meg, amikor a hivatkozásszám eléri a nullát.

  • std::weak_ptr esetén: nem birtokolja az objektumot, csak hivatkozik rá, ezért a delete nem kerül meghívásra a weak_ptr megsemmisítésekor.

  • std::unique_ptr esetén: ha a mutató át lett adva vagy áthelyezve, és a jelenlegi unique_ptr már nem birtokolja az objektumot.

  • Ha az intelligens mutatót egy egyedi deleterrel hozták létre, amely nem hívja meg a delete-et (például más módon szabadít fel erőforrást).

Példa std::shared_ptr-rel:

#include <memory>
#include <iostream>

struct Foo {
    ~Foo() { std::cout << "Foo megsemmisült\n"; }
};

int main() {
    std::shared_ptr<Foo> sp1(new Foo());
    {
        std::shared_ptr<Foo> sp2 = sp1; // hivatkozásszám = 2
    } // sp2 megsemmisül, hivatkozásszám = 1, a delete nem hívódik meg
    // a delete csak akkor hívódik meg, amikor a sp1 is megsemmisül
}

Itt a delete csak azután hívódik meg, hogy az utolsó shared_ptr is megsemmisült.