löscht vector->clear() mit new erstellt Objekte
-
Ich habe einen vector der mit new erstellt wird und Objekte erhält die ebenfalls mit new angelegt werden.
Bei Programmende versuche ich so den Speicherplatz freizugeben:
for(int i = 0; i < m_vObjectHolder->size(); i++) { delete m_vObjectHolder->at(i); } delete m_vObjectHolder;Nach ein paar Schleifendurchläufen tritt aber eine Exception auf:
Debug Assertion failed
Program...
File dbgdel.cpp
Line 52Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)
...
-
Wieso führst du denn ein delete auf den Vektor aus?
-
ich glaub du hast nicht erkannt das der groesste vorteil beim vector der ist das der sich dynamisch speicher reserviert nach bedarf - dh leere den vector dnan ist auch der speicher frei {o;
amsonsten wenn du unbedingt speicher des vectors loeschen willst {sofern einer da ist} kannste den untern arsch wegreissen indem du ein pointer dahin zeigen laesst und diesen dann entsprechen killen laesst { [] }
ist aber alles hinten und vorne quark
-
Probiere es mal so.
for(int i = 0; i < m_vObjectHolder->size(); i++) { delete m_vObjectHolder->at(i); } m_vObjectHolder->clear(); delete m_vObjectHolder;Michael E. schrieb:
Wieso führst du denn ein delete auf den Vektor aus?
Weil es ein Zeiger ist.
Mr Evil schrieb:
ich glaub du hast nicht erkannt das der groesste vorteil beim vector der ist das der sich dynamisch speicher reserviert nach bedarf - dh leere den vector dnan ist auch der speicher frei {o;
Aber nicht der Speicher, auf den die Zeiger, die der Vector als Elemente enthaelt.
-
Apollon schrieb:
Michael E. schrieb:
Wieso führst du denn ein delete auf den Vektor aus?
Weil es ein Zeiger ist.
Stimmt. Hats auch nen praktischen Nutzen, dass der Vektor aufm Heap liegt?
-
Ich erstelle lokale Objekte die nach verlassen der lokalen Funktion nicht gelöscht werden sollen. Wenn ich die Objekte nicht mit new erstellen würde würden sie nach dem Verlassen der Funktion gelöscht. Ich brauche sie aber noch...
Daher möchte ich sie erst bei Programmende freigeben
-
frager schrieb:
Ich erstelle lokale Objekte die nach verlassen der lokalen Funktion nicht gelöscht werden sollen. Wenn ich die Objekte nicht mit new erstellen würde würden sie nach dem Verlassen der Funktion gelöscht. Ich brauche sie aber noch...
Daher möchte ich sie erst bei Programmende freigebenIst an sich ein guter Grund, aber dafür ist es nicht unbedingt nötig, das vector-Objekt selbst auf den Heap zu legen.
Da fände ich üblicher:class MyClass; // call-by-reference eines "pointer-vectors" void f1(vector<MyClass*>& v) { v.push_back(new MyClass()); // muß vom Aufrufer elementweise deleted werden } // call-by-reference eines "value-vectors" void f2(vector<MyClass>& v) { v.push_back(MyClass()); // im vector sind Kopien abgelegt; entweder PODs oder eigene CopyCtors }Bei beiden Varianten muß man "weniger an delete denken".
Der Vorteil des Zweiten ist, dass überhaupt nicht "deleted" werden muß (sprich: MMan kann auch keines vergessen). Nachteil: evtl. hohe "Kopierkosten" (ist aber bei einfachen/kleinen Klassen nicht so relevant).Gruß,
Simon2.
-
Mein Tip: du hast irgendwo geschludert und nicht aufgepasst und "bösen" Code geschrieben. Li-La-Lustiges überschreiben von Speicher, Objekt schon gelöscht aber Pointer nicht auch 0 gesetzt, Buffer Overrun, ...
Viel Spass beim Fehler suchen
-
Plotzenhotz schrieb:
Mein Tip: du hast irgendwo geschludert und nicht aufgepasst und "bösen" Code geschrieben. Li-La-Lustiges überschreiben von Speicher, Objekt schon gelöscht aber Pointer nicht auch 0 gesetzt, Buffer Overrun, ...
Viel Spass beim Fehler suchen
Meinst Du mich oder den "frager" ?
Gruß,
Simon2.
-
@Plotzenhotz
Ich habe tatsächlich bösen Code geschrieben...
Durch einen Designfehler wurde ein Objekt zweimal im Vektor gespeichert. Wenn nun das erste Objekt gelöscht wurde, so gab es beim Zugriff auf das zweite Objekt eine Exception...Jezt luppt es

-
Ich meinte den 'frager'. Und ich hatte Recht
Ui wie fein ist das 