mehrfach delete?



  • Also ich hab da zwo konkrete fragen zum thema delete,
    da ich von java auf c++ gewechselt bin, bin ich garbage-collector verwöhnt.
    1.) Ist es eigentlich schlimm ein und dasselbe objekt zweimal zu "deleten"?

    2.) wenn man den pointer auf ein objekt verloren hat(überschrieben...) kann man das objekt trotzdem irgendwie wiederfinden(um es zu löschen).

    Hab zwar nicht vor das in der praxis zu gebrauchen aber es interessiert mich.
    thx



  • Hallo

    1.) Ist es eigentlich schlimm ein und dasselbe objekt zweimal zu "deleten"?

    Falls du das so meinst

    MyClass* x = new MyClass();
    delete x;
    delete x;
    

    dann ja, das ist schlimmt und führt zu Speicherzugriffsfehlern

    wenn man den pointer auf ein objekt verloren hat(überschrieben...) kann man das objekt trotzdem irgendwie wiederfinden(um es zu löschen).

    Nein, denn im Speicher selber ist nicht zu unterscheiden, was gültig und was nicht. Das weiß nur deine Programmlogik.

    In C++ ist es wichtig und sinnvoll, mit RAII zu arbeiten.

    bis bald
    akari



  • QarateKid schrieb:

    1.) Ist es eigentlich schlimm ein und dasselbe objekt zweimal zu "deleten"?

    akari hat dazu ja schon was gesagt. Wenn du aber nach einem delete deinen Zeiger auf 0 (oder NULL) setzt, dann kann dir nichts passieren, wenn du dann nochmal (aus welchem Grund auch immer) ein delete auf den Zeiger durchführst:

    MyClass* x = new MyClass();
    delete x;
    x=0;
    delete x; // Kein Problem mehr
    

    Greetz



  • @vellas: Ja, diesen einfachen Fall kannst du damit abfangen - aber wenn du von mehreren Stellen aus das selbe Objekt delete'n willst, bekommst du immer noch Probleme.

    @QarateKid: Wenn du auf der sicheren Seite sein willst, nimm Smart-Pointer (z.B. boost::shared_ptr) - die können selber mitverfolgen, wann sie ein Objekt löschen dürfen/müssen.



  • CStoll schrieb:

    ...@QarateKid: Wenn du auf der sicheren Seite sein willst, nimm Smart-Pointer (z.B. boost::shared_ptr) - die können selber mitverfolgen, wann sie ein Objekt löschen dürfen/müssen.

    Alternativ darf man sich ruhig eine Zeit lang mit dem Thema "ownership" beschäftigen. 😉
    Es ist nämlich ein Konzept/eine Denkweise, das/die sich auch in anderen Zusammenhängen als hilfreich erweisen.
    (Nichts gegen Java, aber es ist mir schon öfter aufgefallen, dass Java anscheinend ein wenig dazu anreizt, mit der Frage, wer eigentlich an einem Objekt herumändert, etwas zu schlunzen; .... und hinterher im Abhängigkeitswirrwar unterzugehen)

    Gruß,

    Simon2.



  • CStoll schrieb:

    @vellas: Ja, diesen einfachen Fall kannst du damit abfangen - aber wenn du von mehreren Stellen aus das selbe Objekt delete'n willst, bekommst du immer noch Probleme.

    Jo, stimmt. Bissl an Member in Klassen gedacht. Wenn man da nach jedem löschen einen Zeiger auf 0 setzt (und sichergestellt ist das dieser nicht außerhalb der Klasse verändert werden kann) macht das später im Destruktor nichts mehr. 🙂
    Aber ich benutz ja nimmer so oft Zeiger, die nicht in Smart-Pointern (oder eventuell auto_ptr) gekapselt sind. ^^

    @Simon2:
    Zu der Aussage mit Java kann ich dir nur zustimmen. Aber das Problem hat man wohl allgemein wenn man mit GC arbeitet (ich weiß wieso ich nicht gerne in C# arbeite).

    Greetz



  • Vellas schrieb:

    ... GC ...

    Games Convention ? gnu compiler ? ...

    Gruß,

    Simon2.



  • Dachte das wäre allgemein bekannt als Garbage Collection...naja, zumindest war das gemeint. 🙂

    Greetz



  • Vellas schrieb:

    Dachte das wäre allgemein bekannt als Garbage Collection...naja, zumindest war das gemeint. 🙂

    Greetz

    Aha !!

    Danke - ehrlich gesagt: Da wäre ich nicht drauf gekommen...

    Vellas schrieb:

    ...Aber das Problem hat man wohl allgemein wenn man mit GC arbeitet ...

    Ich denke, die "komplette Verzeigerung" spielt da auch eine Rolle: In C++ weiß ich , wann ich mir "ein fremdes Objekt besorge" (weil Referenz oder Zeiger) und habe die Chance, mit "direkt" mit Objekten (die dann genau mir gehören) zu arbeiten - das habe ich in Java so nicht. IIRC auch keine "const-Parameter" und "const-Funktionen", oder ? ...

    Das sind halt Konzepte, die "Ownership" nahelegen....

    Gruß,

    Simon2.



  • danke an alle für die tipps und antworten,
    werd mich mal als erstes mit smart pointern eingehender beschäftigen, denk ich am plausibelsten,
    ansonsten ist doch alles eine designfrage(ownership), damit haben wohl alle hier recht.
    Durch "gc"-garbage c... mußte man sich um nicht verwiesene objekte in java nicht kümmern, in c/c++ ist das anders, das war mir schon klar.
    Da hat man mit c/c++ als programmierer mehr verantwortung als in java, dafür aber mehr kontrolle!
    na ja ich krieg das schon hin, thx


Anmelden zum Antworten