Verhalten von std::vector
-
Hi!
Ich hab mal eine Frage zum Verhalten von std::vector. Und zwar, was dieser mit dem Inhalt macht, wenn man Elemente entfernt oder den Destruktor des Vectors aufruft.
Ich habe mal gelesen, dass Vector auch die Destruktoren seiner Elemente aufruft und habe das Gefühl, dass sich das in meinem Programm zum Teil bestätigt, zum Teil nicht.
Ich will eigentlich nur Pointer auf meine Objekte in den Vector schmeißen, und diese genau dann deleten, wenn ich es für richtig halte. Leider bekomme ich manchmal (!?!) beim Aufruf des Vector-Destruktoren eine Exception, zusammen mit einem Stacktrace, der mir zeigt, dass scheinbar versucht wurde, die Objekte innerhalb des Destruktors zu zerstören...
Wenn mir jemand Licht ins dunkle des wahren Verhaltens von std::vector bringen könnte...
Vielen Dank
Sören
-
soerenP schrieb:
Ich habe mal gelesen, dass Vector auch die Destruktoren seiner Elemente aufruft
Genau so ist es. Im Falle von Pointern ist das also der "Destruktor" eines Pointers, nicht der Destruktor des Typs selbst. Der Destruktoraufruf auf einem Pointer macht - nichts.
Leider bekomme ich manchmal (!?!) beim Aufruf des Vector-Destruktoren eine Exception, zusammen mit einem Stacktrace, der mir zeigt, dass scheinbar versucht wurde, die Objekte innerhalb des Destruktors zu zerstören...
Das entspricht nicht dem Verhalten eines std::vector. Wir benötigen mehr Infosmationen

Poste doch mal den Stacktrace und relevanten Source.
-
Also ich vermute da mal, dass du da probierst etwas 2 mal zu zerstören.. (löscht du das Element auch aus dem vector, wenn du delete benutzt?)
Oder aber auch, dass du in den vector Zeiger von dynamischen und automatischen Speicher drin hast. Das kann auch problematisch werden.Ansonsten schliesse ich mich LordJaxom an mit :
Wir benötigen mehr Infosmationen

-
Also, ich glaube nicht, dass ich etwas zweimal zerstöre. Deshalb hatte ich ja vermutet, dass der Vektor das macht.
Ich habe Referenzen auf meine dynamisch erstellten Objekte in verschiedenen Vektoren. Damit ich sie nur einmal lösche, habe ich extra einen Vektor gemacht, der das sammelt, was zerstört werden muss und die Elemente zerstöre ich dann am Ende.Den Stacktrace kann ich im Moment nicht posten, da der Fehler nur sporadisch auftritt und ich deshalb gar nicht drankomme

Also, ich fasse mal zusammen, was ihr mir erzählt hab, mal sehen, ob ih das richtig verstanden habe, das würd mir vielleicht schon helfen:
Wenn ich einen Pointer in einen Vektor schmeiße, wird zwar hinterher der Speicherplatz für den Pointer zerstört (er gehört ja auch dem Vektor) mein Objekt wird aber nicht angetastet.
Die Klassendeklaration sieht so aus:
#pragma once #include "ISyncable.h" #include <vector> class SyncManager : public ISyncable { public: SyncManager(void); ~SyncManager(void); void addSyncable(ISyncable* sync){syncables.push_back(sync);} void setSync(float sync, int itemNr=-1); protected: std::vector<ISyncable*> syncables; };Der Fehler tritt dann im leeren Destruktor auf. Wie gesagt, die Syncables werden, da sie noch in anderen Objekten gespeichert werden, in einem "zu zerstören"-Vektor zusammengefasst und nur dort zerstört.
Vielen Dank
Grüße
Sören
-
soerenP schrieb:
Deshalb hatte ich ja vermutet, dass der Vektor das macht.
Die STL-Container geben nur das frei, das sie selbst verwalten. Sprich: nein.
soerenP schrieb:
Wenn ich einen Pointer in einen Vektor schmeiße, wird zwar hinterher der Speicherplatz für den Pointer zerstört (er gehört ja auch dem Vektor) mein Objekt wird aber nicht angetastet.
Genau. Dies ist auch nicht die Aufgabe des Containers (er kann ja nicht wissen ob du Zeiger hälst, um diese zu löschen, oder nur als Kopie).
soerenP schrieb:
Der Fehler tritt dann im leeren Destruktor auf.
Dann tippe ich eher darauf das du dir schon im Vorfeld den Stack zerschießt...
cu André
-
Hmm. Wie sieht den ISyncable aus? Auch brav den Destruktor vituell gemacht?