Objekte im Array zerstören?



  • Hallo

    Ich lege ein Array an, in welches ich eigene Objekte platzieren will:

    CObArray ar;
    ar.Add( new MyObject);
    ar.Add( new MyObject);
    ar.Add( new MyObject);
    ar.Add( new MyObject);
    ar.Add( new MyObject); // 5x reicht :)
    

    Mit 'new' habe ich jetzt jeweils Speicher für mein Objekt angelegt.
    Wenn ich nun die Elemente im Array zerstören will, reicht es, wenn ich ein 'RemoveAll()' mache oder muss ich so etwas machen:

    for(int i=0; i<ar.GetSize(); i++){
     delete (MyObject*) ar.GetAt(i);
    }
    ar.RemoveAll();
    

    Ich verstehs nicht. Ich weiss aber, dass man ein mit 'new' erzeugtes Obj auch mittels 'delete' löschen sollte.



  • Du liegst rischdisch.
    CObArray speichert nur Zeiger. Bei RemoveAll werden nur die Zeiger aus dem Array entfernt, ABER NICHT der Speicher freigegeben, auf den sie zeigen. Daher musst du das selbst machen, siehe deine Schleife.



  • Pellaeon schrieb:

    Du liegst rischdisch.
    CObArray speichert nur Zeiger. Bei RemoveAll werden nur die Zeiger aus dem Array entfernt, ABER NICHT der Speicher freigegeben, auf den sie zeigen. Daher musst du das selbst machen, siehe deine Schleife.

    thx!
    Aber gell, wenn das (MFC) C++ Programm beendet wird. dann wird SO ODER SO der Speicher freigegeben, auch wenn man die expliziten 'delete's vergessen hat?



  • Möge mich bitte jemand korrigieren, falls das nicht stimmt, aber
    ja, beim Programm-Ende wird der gesamte vom Prozess belegte Speicher freigegeben, also auch der explizit allokierte aber nicht wieder explizit freigegebene.



  • jo dann räumt das BS auf



  • Sollte man aber trotzdem nicht tun... bzw. sich gar nicht erst angewöhnen... es gibt nämlich bestimmte Dinge die das OS nicht aufräumt...
    Und wenn man mit dem Speicher schon so schlampig umgeht wie wird das erst mit anderen Sachen 😕

    Auch werden Dir diverse Speicher-Leak-Tools den Fehler anzeigen 😉



  • Jochen, zu deinem Leakfinder: Wie funktioniert das genau? Die Beschreibungen bei codeproject passen irgendwie nicht mehr so recht mit deiner rc3 - Version, oder?
    Kannst du das vielleicht nochmal erklären?



  • Zu meiner RC-3 Version passen sie nicht mehr so ganz... aber vom Prinzip her passt es doch noch 😉

    Was willst Du denn genau wissen?
    Ich bin immer noch dabei ein neuer CP-Artikel diesbezüglich zu schreiben...

    Ich wollte aber zuerst den LeakFinder noch ausbauen und auch z.B. Ressource-Leaks und Handle-Leaks finden... werde ich aber wohl dieses Jahr nicht mehr schaffen...



  • Hallo Leute, dieser Beitrag richtet sich nochmals an das Originalposting dieses Threads:

    Ich lege ein Array an, in welches ich eigene Objekte platzieren will:

    CObArray ar;
    ar.Add( new MyObject);
    ar.Add( new MyObject);
    ar.Add( new MyObject);
    ar.Add( new MyObject);
    ar.Add( new MyObject); // 5x reicht :)
    

    Mit 'new' habe ich jetzt jeweils Speicher für meine Objekte angelegt.
    In diesem Thread wurde mir nun bestätigt, dass sämtliche Objekte wieder mit 'delete' zu löschen sind, bevor mittels 'RemoveAll()' die Zeiger aus dem ObjektArray gelöscht werden. Also:

    for(int i=0; i<ar.GetSize(); i++){
     delete (MyObject*) ar.GetAt(i);
    }
    ar.RemoveAll();
    

    Soweit so gut, nun habe ich die Schlaufe etwas 'frisiert, in dem ich nur das da gemacht hab:

    for(int i=0; i<ar.GetSize(); i++){
     //delete (MyObject*) ar.GetAt(i);  // old
     delete ar.GetAt(i);
    }
    ar.RemoveAll();
    

    BAAAM. Absturz!! Weshalb? Caste ich den Pointer hingegen z.b. auf

    delete (void*) ar.GetAt(i);
    

    funktinoiert wieder alles 😕

    Na DAS ist wohl schräg.
    Ein Zeiger ist doch immer gleich gross oder nicht? d.h. ein Zeiger belegt immer gleich viel Platz.... hmm ui, jetzt bin ich mir nich mehr sicher.. help


Anmelden zum Antworten