Rekursion - mögliche Problematik



  • Mir fiel grad ein, was ist eigentlich wenn in einer Funktion, die sich rekursiv immer wieder aufruft, objekte mit new erstellt werden und nicht sofort gelöscht werden.

    Zum verdeutlichen:

    void tuirgendwas(int IrgendeinParameter)
    {
        // ein haufen schrott :D
        SuperNutzlosKlasse HEY = new SuperNutzlosKlasse;
        if (IrgendeinParameter == Variable_aus_dem_haufen_Schrott)
        {
            tuirgendwas(Variable_aus_dem_haufen_Schrott);
        }
        delete HEY; 
    }
    

    müsste da nicht der Speicher zumüllen, bei häufigem wiederholen ?


  • Mod

    Nö, warum? Wird doch später ein delete gemacht, wenn die Funktionen dazwischen zurückkehren.



  • Solange tuirgendwas keine Exception wirft ist alles gut... deine Code ist ein gutes Beispiel, wie RAII Code robuster machen kann (hier würde sogar ein auto_ptr reichen).



  • SeppJ schrieb:

    Nö, warum? Wird doch später ein delete gemacht, wenn die Funktionen dazwischen zurückkehren.

    void tuirgendwas(int IrgendeinParameter)
    {
        // HIER:
    
        // ein haufen schrott :D
        SuperNutzlosKlasse HEY = new SuperNutzlosKlasse;
        if (IrgendeinParameter == Variable_aus_dem_haufen_Schrott)
        {
            tuirgendwas(Variable_aus_dem_haufen_Schrott);
        }
        delete HEY;
    }
    

    aber wenn

    if (IrgendeinParameter == Variable_aus_dem_haufen_Schrott)
    

    immer zu 99,99% warscheinlichkeit immer wahr ist ? würden doch ein Haufen "SuperNutzlos" Klassen erstellt werden und erst "ganz spät" wieder gelöscht. Oder angenommen das ganze hat ein Fehler und

    if (IrgendeinParameter == Variable_aus_dem_haufen_Schrott)
    

    ist IMMER wahr, krieg ich dann nicht irgendwann ein bösen Speicherüberlauf ?


  • Mod

    Ja, das stimmt, aber das sind allgemeine Probleme bei Rekursion, dass irgendwann dein Speicher voll ist. Ob die Objekte dabei auf dem Stack oder dem Heap liegen ist unerheblich. Und wenn die Abbruchbedingung nicht stimmt, dann scheitert deine Rekursion ohnehin immer.

    Du hättest exakt das gleiche wenn du dies schreiben würdest:

    void tuirgendwas(int IrgendeinParameter)
    {
        SuperNutzlosKlasse HEY;
        if (IrgendeinParameter == Variable_aus_dem_haufen_Schrott)
        {
            tuirgendwas(Variable_aus_dem_haufen_Schrott);
        }
    }
    

    Genau gleiches Problem.



  • Das ist zwar immer das Problem bei Rekursionen, aber eine große Klasse (weiß ja nicht, was du damit sonst noch anstellst) würde den Prozess natürlich beschleunigen...


Anmelden zum Antworten