Problem mit Pointer beim 2. Aufruf der Methode



  • Hallo,

    hab anscheinend Pointer immer noch nicht verstanden, kann mir jemand auf die Sprünge helfen?

    Also ich übergebe der Methode als Parameter einen Pointer und weise den einer Klassenvariable zu. SoSeparator ist aus der open inventor Bibliothek.

    bool refresh(SoSeparator* root) {
    
    m_root = root;  //in .h deklariert SoSeparator* m_root
    
    }
    

    Beim ersten Aufruf funktioniert alles wunderbar.

    SoSeparator* erstesroot;
    refresh(SoSeparator* erstesroot)
    

    Dann lösche ich alle Elemente von m_root:
    m_root->removeAllChildren();

    Da ich jetzt neue Werte habe rufe ich erneut auf:

    refresh(SoSeparator* erstesroot)
    

    Jetzt kommt ein Laufzeitfehler, d.h. mein Prog. stürzt ohne Fehlermeldung bei der Zeile m_root = root ab.

    m_root und root sind doch Pointer. Also ich weise den Wert, auf den root zeigt, dem Zeiger m_root zu. Was ist hier falsch? Wenn die Methode das 2. Mal durchlaufen wird, wird doch der Wert des Zeigers geändert? Oder?

    schon mal vielen Dank!



  • hi,

    wo/wie legst Du denn ein SoSeparator-Objekt an, auf das root/m_root zeigen sollen ?
    Bei einer reinen Pointerzuweiseung kann eigentlich nichts schieflaufen - ich tippe darauf, dass der Fehler in einem Codestück ist, das wir hier nicht sehen.

    Gruß,

    Simon2.



  • Beim Aufruf der Funktion biegst du m_root auf den Speicherblock, auf den auch der übergebene Parameter zeigt. Das heißt, mit dem 'removeAllChildren()' löschst du die ganze Datenstruktur, die du vorher zusammengebaut hast.

    Die Zuweisung selber dürfte keine Probleme liefern, aber möglicherweise hast du vorher das Ziel von 'erstesroot' demoliert und versuchst nun mit ungültigen Daten zu arbeiten.



  • bool refresh(SoSeparator* root) {
    
    m_root = root;  //in .h deklariert SoSeparator* m_root
    
    }
    

    Also ich weise den Wert, auf den root zeigt, dem Zeiger m_root zu.

    Nein. Du weist m_root den Wert von root zu; beides sind Zeiger; also zeigt m_root hinterher auf die gleiche Speicherstelle auf die root zeigt.

    Es mag sein dass Du das gleiche meinst aber hier ist die Unterscheidung vielleicht wichtig, da imo hier was schief läuft:

    SoSeparator* erstesroot; // zeigt auf uninitalisierten Speicher
    refresh(SoSeparator* erstesroot)// m_root zeigt spätestens jetzt auch auf uninitalisierten Speicher
    

    Wenn vor dem ersten Aufruf von removeAllChildren() nichts wesentliches mehr passiert stürzt das Programm nur aufgrund eines wirdrigen Zufalls nicht schon dort ab.

    Grüsse

    *this



  • Danke füe die Hilfe!!

    Unfassbar, ich hatte SoSeperator 2x declariert im .h und in .cpp.

    Muss mich echt noch an c++ gewöhnen, java compiler hätte da gemotzt.



  • <---> schrieb:

    Danke füe die Hilfe!!

    Unfassbar, ich hatte SoSeperator 2x declariert im .h und in .cpp.

    Muss mich echt noch an c++ gewöhnen, java compiler hätte da gemotzt.

    Hi,

    das hätte der C++-Compiler bestimmt auch ... wenn Du das .h im .cpp inkludiert hättest. 😃
    Merke: Der Compiler hat immer Recht. 😉

    Gruß,

    Simon2.


Anmelden zum Antworten