Objekte richtig freigeben



  • Hallo C++ Freuende!!!

    Ich habe eine Klasse definiert und daraus einen Objekt erzeugt. Nachdem ich mit dem Objekt fertig bin, lösche ich den wieder mit delete Objekt;.
    Ich habe aber festgestellt, dass ich immer noch auf die einzelnen Methoden des Objekts zugreifen kann! Diese verweisen zwar nur auf die Stellen wo früher die Variablen ihren Platz hatten, ich frage mich aber ob ich nicht etwas falsch bei der Freigabe von Objekten mache.

    i++;
    Csample *sample = new Csample(i);
    ShowMessage(sample->getId());
    delete sample;
    if (sample != NULL)
    Form1->Caption = sample->getId();
    

    Gebe ich richtig mein Objekt frei?
    Wie kann ich abfragen ob mein Objekt gelöscht worden ist?

    Vielen Dank
    coder24h



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum Borland C++ Builder (VCL/CLX) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Also, was kannst du denn mehr machen, als ein mit new erzeugtes Objekt mit delete wieder zu löschen? Falls es dann Speicherlecks gibt, ist die Klasse daran schuld.
    Aber die Sache mit den Methoden ist die:

    class A
    {
      // ...
      inline void M(){};
    };
    
    A *p = NULL;
    p->M(); // müsste trotzdem manchmal funktionieren
    

    Das witzige ist, dass Methoden, die nicht wirklich was mit der Instanz machen, manchmal trotzdem funktionieren, auch wenn die Instanz ungültig ist, denn

    void A::M()
    

    wird ja praktisch übersetzt in

    void M(A *this)
    

    (wobei der Name "gemanglet" wird)
    und wenn this nie wirklich dereferenziert wird, passier oft auch nicht schlimmes.
    Aber ich würde mich nicht darauf verlassen! Es gibt ja "static-Methoden".



  • Danke sehr _Till_ !!!

    Mir fehlen noch ein paar Grundlagen und es ist schön eine Hilfestellung aus dem Forum zu erhalten.

    Viele Grüße
    coder24h



  • Also so wie ich das sehe gibt dein Code zwar mit delete den Speicher frei. er derefferenziert aber den Pointer nicht. Wenn du dann checkst ob der Pointer!=Null ist, ist das immer true. Der Kompiler lässt dich auch weiter auf die Methoden des Objekts zugreifen, weil er ja nicht weiss das der Pointer auf freigegebenen Speicher zeigt. Schliesslich hast du ja behauptet es sei ein Pointer auf ein Objekt des TYps xy. Das kann gut gehen, wenn der Speicher inzwischen nicht überschrieben wurde. Es ist aber unvorhersehbar und daher indiskutabel.

    Nachdem man den Speicher eines Objekts mit delete freigegeben hat setzt man IMMER direkt den pointer auf NULL, damit eben keine fälschlichen Zugriffe erfolgen können, bzw. man wenn diese erfolgen eine exacte Fehlermeldung bekommt und kein unvorhersehbares Systemverhalten.

    Man verbessere mich wenn ich Quatsch rede.

    mfG

    robi1806



  • hi!

    du könntest für sowas auch Die Templateklasse auto_ptr verwenden like that:

    auto_ptr<Csample> sample(new Csample(i));
    

    dann brauchst du kein delete mehr aufrufen...das objekt wird automatisch gelöscht...die Verwendung eines auto_ptrs garantiert, dass das verwaltete Objekt automatisch auch im Falle einer Exception korrekt freigegeben wird. Die Gefahr das es zu unerwarteten Speicher- bzw. Resourcenlöchern kommt ist also deutlich geringer.

    infos:
    http://fara.cs.uni-potsdam.de/~kaufmann/?page=GenCppFaqs&faq=auto_ptr#Answ

    cu



  • Hallo!

    Ich sehe schon, dass da mehrere Möglichkeiten bestehen. Ich werde die beiden Varianten ausprobieren ist auch sehr interessant.

    Vielen Dank
    coder24h


Anmelden zum Antworten