(C++) Nach delete: Objekt noch im Speicher

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • (C++) Nach delete: Objekt noch im Speicher

    Hi,


    könnte mir einer bitte Folgendes bestätigen oder wenn falsch erklären?


    Wenn ich ein Objekt auf dem Heap habe und dann dafür "delete" aufrufe, wird das Objekt nicht direkt gelöscht (oder mit was beliebigem überschrieben) sondern lediglich der Zugriff auf diese Speicheradresse für den Rest des Systems freigegeben. Dies hat zur Folge, dass ich auch noch evt. nach dem delete auf das vermeintlich gelöschte Objekt Zugriff habe.



    Ich habe das bereits ausprobiert und dieses Verhalten tritt auf. Ist diese Aussage immer gültig oder habe ich hier eine zufällige Ausnahme erwischt?
  • wenn Du einen pointer mit delete löschst, dann ist die anschließende Dereferenzierung desselben undefiniertes Verhalten, sehr wahrscheinlich bekommst Du eine Speicherschutzverletzung. Aber in 99,9999999999999999999999999999999999% aller Fälle benutzt Du mit C++ keine Pointer direkt, sondern benutzt std::unique_ptr bzw std::shared_ptr. Dann musst Du Dich ums aufräumen nicht selber kümmern (equivalent zu ARC).

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von Markus Müller ()

  • Danke, @gritsch, auf die Idee bin ich noch überhaupt nicht gekommen, etwas nachzuschlagen, was man vorher nicht kannte. :whistling:

    Solltest du keine Lust oder keine Zeit haben, mir gescheit zu Antworten, oder ebenfalls darüber noch kein Wissen erworben haben (für alle drei Optionen hab ich Verständnis), wäre es für mich auch ok gewesen, aber solch ein sinnloser Link bringt mir leider nichts.


    Da der unique_ptr laut wikipedia anscheinend erst in der Version C++11 verfügbar ist, deren Veröffentlichung ja noch nicht so lange her ist (2011), erschienen mir Markus' 99,99999% sehr hoch, falls man den unique_ptr manuell erstellen muss.
  • chrizke schrieb:

    Danke, @gritsch, auf die Idee bin ich noch überhaupt nicht gekommen, etwas nachzuschlagen, was man vorher nicht kannte. :whistling:

    Solltest du keine Lust oder keine Zeit haben, mir gescheit zu Antworten, oder ebenfalls darüber noch kein Wissen erworben haben (für alle drei Optionen hab ich Verständnis), wäre es für mich auch ok gewesen, aber solch ein sinnloser Link bringt mir leider nichts.


    Da der unique_ptr laut wikipedia anscheinend erst in der Version C++11 verfügbar ist, deren release ja noch nicht so alt ist, erschienen mir Markus' 99,99999% sehr hoch, falls man den unique_ptr manuell erstellen muss.


    aber google hat dir wohl gesagt dass dein code nix mit unique_ptr zu tun hat.
    google doch einfach mal generell nach smart pointern in c++ bzw schau dir die boost-doku an!
  • boost smart-pointer gibt es schon seit gefühlten hundert Jahren, die schon immer die Funktionalität geboten haben, die jetzt mit C++11 zum Standard geworden ist.

    Und nein, "new" liefert immer einen Pointer. Du musst schon explizit einen shared_ptr erstellen, oder ganz auf Pointer verzichten (RAII etc). In den meisten Fällen braucht man in C++ gar keine Pointer.

    Für Dein Beispiel mit boost:
    boost::shared_ptr<foo> f = boost::make_shared<foo>();
    C++
  • Es gibt eben nur extrem wenig Fälle, in denen man überhaupt grossartig mit "new" und Pointern hantieren muss, und dort sollte man eigentlich immer Smart-Pointer verwenden. Und in "ordentlichen" / produktiv- Code ist dass meiner Erfahrung nach auch zu einem hohen Anteil genau so gelöst. Abgesehen vielleicht von etwa Qt, was das Speichermanagement wieder noch etwas anders macht (und ich auch nicht wirklich leiden kann..) - aber auch da legt man ein einfaches Array oder so eigentlich nie mit "new" an.
    C++
  • Die 99,99999% Prozent bezogen sich darauf, dass man in C++ fast nie raw-Pointer verwendet. Aber wie zerm schon anmerkte, braucht man eigentlich selten Pointer (man verwendet stattdessen Referenzen oder anstatt C-Arrays die Standard Library collections). Schau Dir mal die C++11 Videos der going native Konferenz von diesem Jahr an, da findest Du mehr über modernes C++.