Kommt es zu einem Speicherleck?



  • Dann sollt's IMHO legal sein.



  • Swordfish schrieb:

    Dann sollt's IMHO legal sein.

    Das ist aber hässlich, nicht? :schluchz:



  • Darum fast nie. Referenzen auf statische Objekte sind eine Ausnahme.
    Es kann sich sogar als nützlich erweisen ein Objekt in eine Funktion oder Methode zu stecken, nämlich wenn der Initialisierungs Zeitpunkt des Objektes unklar ist. Zu lesen in Effektiv C++, ich glaube es war die dritte Auflage.



  • Vielleicht eine etwas genauere Erklaerung:

    int & func() 
    { 
    int x = 10; // Automatic Storage Duration
    return x; 
    }
    

    Das Verhalten dieses Codes ist nicht definiert. Der Grund dafuer ist, dass x "Automatic Storage Duration" hat, d.h. wenn die Funktion verlassen wird, so wird x automatisch geloescht. Du gibst in deiner Funktion eine Referenz auf eine Variable zurueck, die zerstoert ist. Das heisst die zurueckgegebene Referenz zeigt irgendwo ins Nirvana.
    Dieses Verhalten ist nicht definiert.

    Falls dir die Begriffe "Automatic storage duration", "Static storage duration", "Dynamic storage duration" (ich weiss nicht wie die Begriffe auf deutsch sind), dann solltest du das nachlesen.



  • Mit

    int x = 10
    

    wird der Variable x den Wert 10 zugewiesen und mittels return die Referenz zurückgegeben. Die Lebenszeit einer Variable bleibt solange erhalten, bis die letzte geschweifte Klammer erreicht wird. Beispiel:

    {
        int x = 10 
    } /* Ende */
    

    Danach hört die Lebenszeit auf.

    Das sollte ja verständlich und klar sein. In dem Fall mit der Referenz ist es aber so, dass die Lebenszeit nicht endet, sondern weiter erhalten bleibt. Nach dem Verlassen der Funktion ist es dennoch möglich über die zurückgegebene Referenz auf x (indirekt) zuzugreifen. Streng genommen wäre das ja schon ein Memory Leak, oder?

    Lässt sich von außen die Lebenszeit beenden, ohne a) die Funktion, die die Funktion aufruft zu verlassen und b) ohne "Tweaks" zu arbeiten? Ich möchte also sagen:

    int & func()
    {
    int x = 10;
    
    return x;
    }
    
    void testfunc()
    {
    int test = func();
    // Hier Lebenszeit von test/&x beenden
    }
    

  • Mod

    inc7 schrieb:

    In dem Fall mit der Referenz ist es aber so, dass die Lebenszeit nicht endet, sondern weiter erhalten bleibt.

    nein.

    @icarus: Soweit ist da noch nichts undefiniert. Problematisch wird es erst, wenn der Rückgabewert verwendet wird.



  • inc7 schrieb:

    In dem Fall mit der Referenz ist es aber so, dass die Lebenszeit nicht endet, sondern weiter erhalten bleibt.

    Nein, die Variable wird zerstoert wenn die Funktion verlassen wird - nach den Regeln der Automatic Storage Duration.

    Wenn du willst, dass die Variable nach Beendigung der Funktion weiterexistiert, dann musst du dafuer sorgen, dass die Dynamic Storage Duration bekommt. Das erreichst du, indem du Speicher met new anforderst, also etwa so:

    int *func()
    {
    int *x = new int(10);
    
    return x;
    }
    

    Dann existiert die Variable auch nach Beendigung von func(). Das Problem ist dann allerdings, dass der Speicher irgendwo wieder freigegeben werden muss. Das ist bei grossen Programm schnell unueberschaubar. Deshalb sollte man solchen Code wenn immer moeglich vermeiden.



  • Naja, solange eine Referenz auf eine statische Variable gültig bleibt, brauch ich kein new . Aber bitte, bitte möge irgendjemand Standardbelesenes hier auftauchen und verlauten, das dies nicht funktioniert, denn ich find's grausam. 😉


  • Mod

    Swordfish schrieb:

    Naja, solange eine Referenz auf eine statische Variable gültig bleibt, brauch ich kein new . Aber bitte, bitte möge irgendjemand Standardbelesenes hier auftauchen und verlauten, das dies nicht funktioniert, denn ich find's grausam. 😉

    Dann braucht Meyers aber ein neues Singleton.



  • Jo. Dann soll der Meyer sein Singleton b'halten 😉



  • Danke für eure Antworten!


Anmelden zum Antworten