Konstruktor/Destruktor und OpenSceneGraph NodeVisitor
-
Hallo Leute,
sorry erst mal, ich weiß echt nicht was ich da als Titel eingeben sollte. Ich weiß nicht mal ob das hier das richtige Forum ist oder ob ich in einem Forum für OpenSceneGraph nachfragen soll.Ich habe hier folgendes Programm, welches mir abstürzt:
#include <stdio.h> #include "osg/Group" class MyVisitor : public osg::NodeVisitor { public: char* mPuffer; MyVisitor(char* puffer) { printf("Konstruktor\n"); printf("%s\n",puffer); mPuffer = puffer; } ~MyVisitor() { printf("Destruktor\n"); } }; class MyServer { public: char* mPuffer; MyServer() { mPuffer = new char[10]; mPuffer[0] = 'H'; mPuffer[1] = 'a'; mPuffer[2] = 'l'; mPuffer[3] = 'l'; mPuffer[4] = 'o'; mPuffer[5] = 0; //MyVisitor* mw = new MyVisitor(mPuffer); MyVisitor mw(mPuffer); } }; int main(int argc, char** argv[]) { MyServer* ms = new MyServer(); system("pause"); return 0; }Die Fehlermeldung lautet:
Unbehandelte Ausnahme bei 0x100c4475 in Konfigurator_Server.exe: 0xC0000005:
Zugriffsverletzung beim Lesen an Position 0x00000003.Der Haltepunkt zeigt auf die Zeile nach MyVisitor mw(mPuffer); im Konstruktor von MyServer, also Zeile 35.
Ich habe hier zwei Möglichkeiten, zu verhindern, dass das Programm abstürzt:
1.Ich leite meine Klasse MyVisitor nicht von osg::NodeVisitor ab, also Zeile 4
class MyVisitor
anstatt
class MyVisitor : public osg::NodeVisitor2.Ich benutze die auskommentierte Zeile 33 anstatt Zeile 34, also
MyVisitor mw = new MyVisitor(mPuffer);*
anstatt
MyVisitor mw(mPuffer);Ähm... tja... also ich hab kein Problem damit, meine zweite Lösungsvariante zu benutzen. Aber ich würde doch gerne verstehen was da schief läuft...
Weiß das jemand?MfG
-
SchlechterInformatiker schrieb:
2.Ich benutze die auskommentierte Zeile 33 anstatt Zeile 34, also
MyVisitor mw = new MyVisitor(mPuffer);*
anstatt
MyVisitor mw(mPuffer);Mach mal
MyVisitor* mw = new MyVisitor(mPuffer); delete mw;Keine Ahnung wass osg::NodeVisitor ist, sieht aber so aus als geht da was im Destruktor ~NodeVisitor was schief.
-
Ja,
MyVisitor* mw = new MyVisitor(mPuffer); delete mw;stürzt ebenfalls ab.
Zwischenfrage: Wieso wird denn da ~NodeVisitor() aufgerufen? Ich stelle doch selber einen Destruktor bereit...?
-
SchlechterInformatiker schrieb:
Wieso wird denn da ~NodeVisitor() aufgerufen? Ich stelle doch selber einen Destruktor bereit...?
Die Basisklassendestruktoren werden automatisch aufgerufen.
-
Ja ok, dann läuft also wohl in ~NodeVisitor() irgendwas schief...

-
Ich kenne mich mit der Lib nicht aus, aber man muss die Pointer vermutlich mit osg::ref_ptr verwalten => Doku lesen
-
Hab schon mal damit herumgespielt, aber erst ging es nicht. Aber jetzt hab ich es hinbekommen mit dem osg::ref_ptr.
osg::ref_ptr<MyVisitor> mw = new MyVisitor(mPuffer); //Irgenwas machen mw.release();Viele Dank!