Wann wird beim Smart Pointer der delete-Operator für das Objekt nicht aufgerufen?
sobes.tech KI
Antwort von AI
Der delete-Operator für ein von einem Smart-Pointer verwaltetes Objekt wird in folgenden Fällen nicht aufgerufen:
-
Für
std::shared_ptr: wenn mindestens ein weiterershared_ptrexistiert, der dasselbe Objekt besitzt. Die Löschung erfolgt nur, wenn der Referenzzähler auf null sinkt. -
Für
std::weak_ptr: besitzt das Objekt nicht, sondern verweist nur darauf, daher wirddeletebeim Zerstören desweak_ptrnicht aufgerufen. -
Für
std::unique_ptr: wenn der Zeiger übertragen oder verschoben wurde und der aktuelleunique_ptrdas Objekt nicht mehr besitzt. -
Wenn der Smart-Pointer mit einem benutzerdefinierten Deleter erstellt wurde, der
deletenicht aufruft (z.B. Ressource auf andere Weise freigibt).
Beispiel mit std::shared_ptr:
#include <memory>
#include <iostream>
struct Foo {
~Foo() { std::cout << "Foo zerstört\n"; }
};
int main() {
std::shared_ptr<Foo> sp1(new Foo());
{
std::shared_ptr<Foo> sp2 = sp1; // Referenzzähler = 2
} // sp2 wird zerstört, Zähler = 1, delete wird nicht aufgerufen
// delete wird nur aufgerufen, wenn sp1 auch zerstört wird
}
Hier wird delete nur nach der Zerstörung des letzten shared_ptr aufgerufen.