Sobes.tech
Middle

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 weiterer shared_ptr existiert, 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 wird delete beim Zerstören des weak_ptr nicht aufgerufen.

  • Für std::unique_ptr: wenn der Zeiger übertragen oder verschoben wurde und der aktuelle unique_ptr das Objekt nicht mehr besitzt.

  • Wenn der Smart-Pointer mit einem benutzerdefinierten Deleter erstellt wurde, der delete nicht 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.