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_ptresetén: ha van legalább egy másikshared_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_ptresetén: nem birtokolja az objektumot, csak hivatkozik rá, ezért adeletenem kerül meghívásra aweak_ptrmegsemmisítésekor. -
std::unique_ptresetén: ha a mutató át lett adva vagy áthelyezve, és a jelenlegiunique_ptrmá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.