rekursive Methode in einer C++ Klasse



  • Hallo Leute,

    bin gerade dabei einen XML Parser zu schreiben, der mir die Werte in einen binären Baum hängt. Zu diesem Zweck möcht ich die Methode, in der ich den Baum
    befülle, rekursiv aufrufen. Woran ich leider nicht ganz gedacht habe, ist das ja jede Instanz einer Klasse ihren eigenen Speicherbereich hat und wenn ich nun eine Methode von dieser Klasse mehrmals aufrufe, die Methode ja keine neue Instanz wird.

    Gibts da irgendeinen Trick wie man sowas sauber hinbekommt?

    lg. Joe



  • Hallo

    Die Frage ist doch eher ob du wirklich fü jeden Rekursionsdurchgang eine neue Instanz brauchst?
    Wenn du wirklich jeweils eine neue Instanz brauchst, must du eben manuell eine solche Anlegen

    MyCLass::Recursive()
    {
      for (...)
      {
        MyClass sub;
        sub.Recursive();
      }
    }
    

    Wenn du die Instanzen auch nach Recursive() brauchst must diese in einen externen Container zwischenlagern und/oder mit dynamischer Speicherreservierung arbeiten.

    bis bald
    akari



  • Joe80 schrieb:

    ...die Methode ja keine neue Instanz wird. ...

    Entweder habe ich da etwas im Kern noch nicht verstanden (was ich nicht ausschliießen möchte) oder Du hast Dich nicht klar ausgedrückt oder Du hast da noch einen Denkfehler.
    Ich wüsste auch nicht, wo das Problem beim gleichzeitigen Einsatz von OO und Rekursion wäre...

    Gruß,

    Simon2.



  • ja ich bin mir auch nicht ganz sicher ob ich nicht einen Denkfehler hab 😉

    also es ist so:

    MyClass::MyClass()
    {
     Node *btree = new Node();
    }
    MyCLass::createTree()
    {
      //Variablen der Methode
      bool status;
    
      if(...)
      {
        createTree();
      }
    }
    

    meine Frage zielt eigentlich darauf ab, ob das richtig ist, das wenn ich die Methode createTree() rekursiv aufrufe, das dann die Variablen in der Methode neu im Speicher erstellt werden, oder ob die schon vorhandenen überschrieben werden?

    Ich hoff jetzt wars bissal besser erklärt!?

    thx. Joe



  • sie werden natürlich neu erstellt



  • na das ist eine gute nachricht, denn beim Debuggen meiner Methode hatte ich den Eindruck, das meine Mehthoden-Variablen nur überschrieben werden, und das führt zu totalem Chaos *g*

    lg. Joe



  • BTW:
    Wenn du unter Windows mit VS arbeitest solltest du auf jeden Fall die Stack-Size maximieren, wenn du mit rekursiven Funtkionen hantierst. Denn alle Variablen werden dort abgelegt und es kann relativ schnell zum stack-overflow kommen (nicht immer leicht zu debuggen). Wir haben das Problem bei rekursiven Füllalgorithmen bei Geometrien...



  • danke für den Tipp, und wie mach ich das beim VS 2003?

    Weil wir grad beim Thema sind, wie find ich raus was Memory Leaks verursacht?
    Kann das dadurch ausgelöst werden, wenn ich eine verkettete Lista habe und diese nicht vor dem Programmende komplett freigebe?

    lg. Joe



  • Joe80 schrieb:

    Weil wir grad beim Thema sind, wie find ich raus was Memory Leaks verursacht?
    Kann das dadurch ausgelöst werden, wenn ich eine verkettete Lista habe und diese nicht vor dem Programmende komplett freigebe?

    Im einfachsten Fall durch ein #define new DEBUG_NEW am Anfang des Programms (das TRACE't dir am Programmende alle nicht freigegebenen Speicherblöcke zusammen mit der Zeile, in der sie reserviert wurden. Für genauere Analysen gibt es komplexere Leak-Detektoren.

    Und ja, diese Liste könnte das Problem sein - spendier ihr mal einen Destruktor, der die letzten verbleibenden Listenelemente aufräumt.



  • hmm, also ich bin bisher immer davon ausgegangen, das mir der Standard Destructor von der Klasse, aus der die einezelenen Listen Knoten bestehen den Speicher von selber freigibt. Ist das ein Irrglaube meinerseits?



  • Hast Du irgendwo selbst "new" benutzt? Dann musst Du auch selbst "delete" benutzen (es seidenn Du verwendest Smartpointer). Eigentlich ganz einfach 😉



  • ja war fleißig mit dem "new" verwenden *g*

    ok, was sind bitte "smartpointer" ist das was unanständiges?



  • Smartpointer sind Gebilde, die einen Zeiger verwalten, und sie automatisch zu einem adäquaten Zeitpunkt freigeben. Dieser Zeitpunkt könnte z.B. die Destruktion eines Objekts sein. Der Smartpointer selbst darf dafür natürlich nicht mit new angelegt worden sein 😉

    Gibt im Magazin einen schönen Artikel über den Smartpointer der Standardbibliothek und die von Boost, schau Dir den mal an!



  • ok, werd ich mir gelich mal einverleiben 😉

    thx. Joe


Anmelden zum Antworten