Objekt zerstören, wenn es nicht mehr referenziert wird



  • Hallo,

    Ich habe ein Objekt vom Typ Foo im Heap, auf das mehrere Klassen A,B etc zeigen.
    (A hat also einen Zeiger Foo* f, B auch usw).
    Wie mache ich das nun, dass Foo korrekt gelöscht wird?

    Ich kann ja nicht einfach im Dtor von A ein delete foo; machen, da ich dann bei einem Zugriff von B auf Foo auf gelöschten Speicher zugreifen würde.
    Ich dachte an eine Art Referenzzähler eine Methode release:
    release() { counter--; if(counter == 0) delete this; }

    Wenn kein Objekt mehr auf Foo zeigt, löscht es sich also selber. Geht dieses delete this?



  • Das kannst du sicher so machen. Afaik machen das die Smartpointer auch so.

    Wenn du es nicht selber schfeiben willst, hilft dir da boost.



  • Ja, "delete this" ist OK.
    (Natürlich darf "this" danach weder explizit noch implizit dereferenziert werden, was auch irgendwo logisch sein sollte.)



  • Wäre hier nicht ein shared_ptr die Lösung? Der macht inetrn Referenzzählung und du musst dich darum nicht kümmern.

    Gruß
    Don06



  • std::tr1::shared_ptr<T>



  • Danke Leute, ihr seid die Besten. 👍

    Noch 2 kleine Fragen:
    1. Was basiert wenn ich delete this auf ein Objekt auf dem Heap aufrufe?
    2. Was muss ich für std::tr1::shared_ptr einbinden (Header, Lib)? Ich benutze VS 05.



  • ObjLöscher schrieb:

    Danke Leute, ihr seid die Besten. 👍

    Noch 2 kleine Fragen:
    1. Was basiert wenn ich delete this auf ein Objekt auf dem Heap aufrufe?

    Undefiniert, da du delete nur für Objekte auf dem free store verwenden darfst.

    Wenn du allerdings das Objekt mit new angelegt hast ist es bereits im free store (in den heap bekommst du Objekte mit malloc() ) wird wohl der destructor aufgerufen und der Speicher freigegeben

    2. Was muss ich für std::tr1::shared_ptr einbinden (Header, Lib)? Ich benutze VS 05.

    boost::tr1 oder auf VC08 updaten


Anmelden zum Antworten