PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C++ STL Stack Pointer


instinct
2009-11-07, 17:39:09
Ich habe einen Stack mit Pointern:

...
std::stack<BVHNode *> node_stack;
...


Ab einem bestimmten Zeitpunkt will ich die Objekte auf dem Stack abarbeiten:

...
BVHNode *node = node_stack.top();
node_stack.pop();
...


Nun endet das Programm (nicht direkt beim ersten pop()) ohne jegliche Fehlermeldung. Daher meine Frage:
Wird bei Aufruf der Methode std::stack.pop() ein delete des Pointers durchgeführt?
Wenn ja, wie könnte ich das obige Problem sonst lösen?

Coda
2009-11-07, 18:17:03
Häng mal den Debugger dran.

Nein, es wird kein delete ausgeführt. Und pass auf, dass du nicht pop() ausführt, wenn nichts auf dem Stack ist.

instinct
2009-11-07, 19:31:01
Vor dem pop() wird geprüft, ob der Stack leer ist. Debuggen ist relativ schwierig, da der Code in einer parallelisierten Umgebung läuft. Ich werd trotzdem mal schauen, was sich machen lässt.

Coda
2009-11-07, 22:37:23
Die STL ist nicht Thread-Safe. Ich denke darin liegt das Problem.

Gnafoo
2009-11-08, 19:42:40
Lediglich das im vector gespeicherte Objekt wird zerstört. Soll heißen: würdest du direkt ein Objekt im vector ablegen, würde dort auch der Destruktor aufgerufen. In deinem Fall enthält der vector aber nur Pointer auf die Objekte. Die Pointer selbst werden zerstört, nicht jedoch die Objekte, auf die diese zeigen.

Man kann ein solches Verhalten ggf. mit passenden Smart-Pointern erhalten. z. B. müsste das afaik mit boost::shared_ptr (bzw. std::tr1::shared_ptr) problemlos funktionieren. Nur std::auto_ptr darf man hier auf keinen Fall verwenden, da der vector durchaus auch intern Daten herumkopiert und das Kopier-Verhalten des std::auto_ptr dabei das Objekt zerstören kann.

Ich bin mir allerdings nicht sicher, wie es mit dem Smart-Pointer in Multi-Threaded-Umgebungen aussieht. Wenn man die verwendet, sollte man in der Dokumentation nachsehen.

instinct
2009-11-08, 19:51:14
Danke für eure Antworten. Das Problem lag an der parallelen Umgebung. Ich habs etwas umstrukturiert. Jetzt läuft es.

Coda
2009-11-08, 21:53:40
Bitte bedenke aber, dass es soetwas wie Race-Conditions gibt. Wenn du nicht 100% ausschließen kannst dass nicht zwei Thread gleichzeitig auf den Stack zugreifen solltest du den Zugriff besser in einer Mutex-Section machen.

Gast
2009-11-10, 18:18:16
Die STL ist nicht Thread-Safe. Ich denke darin liegt das Problem.

afair steht irgendwo in der STL-Spec (frei formuliert wie ich es in erinnerung habe) "die STL ist Thread save für genau einen Thread"... ^^

mfg,
zgep