was passiert, wenn man eine referenz auf ein lokales objekt returned?



  • eine eindeutige antwort habe ich nicht gefunden.

    einer meint, das objekt müsse so lange bestehen, wie die referenz selbst. demnach würde das objekt nicht zerstört werden und das wäre konform:

    std::string& func()
    {
        std::string test("test");
        return test;
    }
    
    std::string test = func();
    

    stimmt es, oder stimmt es nicht?



  • Probiers doch einfach aus.

    An sich, solltest du, wenn du soetwas vor hast einfach deine Objekte auf den Heap pushen.
    Auf jedenfall sauberer und konform.



  • Referenzen können nur Lebzeiten von temporären Objekten verlängern, funktioniert also nur mit konstanten Referenzen:

    {
        const std::string& ref = std::string("Hallo"); // Temporäres Objekt
        // Objekt per Referenz benutzen...
    } // << wird hier mit der Referenz zerstört.
    

    Gruß
    Don06



  • makkurona schrieb:

    Probiers doch einfach aus....

    Das ist oftmals keine besonders gute Idee, wenn man sich an den Grenzen von "undefiniertem Verhalten" bewegt. ...

    Gruß,

    Simon2.


  • Mod

    local ref returner schrieb:

    eine eindeutige antwort habe ich nicht gefunden.

    einer meint, das objekt müsse so lange bestehen, wie die referenz selbst. demnach würde das objekt nicht zerstört werden und das wäre konform:

    std::string& func()
    {
        std::string test("test");
        return test;
    }
    
    std::string test = func();
    

    stimmt es, oder stimmt es nicht?

    nein. Im Allgemeinen ändert das Binden an eine Referenz nichts an der Lebensdauer eines Objektes. Dies ist lediglich anders, wenn ein temporäres Objekt an eine Referenz gebunden wird (da das im Allgemeinen rvalues sind, kommen nur Referenzen auf const in Betracht).
    - Ein temporäres Objekt, das im ctor an ein Referenzmember gebunden wird, lebt bis zum Ende des Konstruktors.
    - Ein temporäres Objekt, dass an einen Refernzparameter eines Funktionsaufrufes gebunden wird, lebt bis zum Ende des vollständigen Ausdrucks, der den Funktionsaufruf enthält (hier führt es also nicht zu einer anderen Lebensdauer).
    - Ein temporäres Objekt, dass an den Rückgabewert einer Funktion, die eine Referenz zurückgibt, gebunden wird, lebt bis zum Ende der Funktion
    - In allen anderen Fällen lebt das temporäre Objekt, das an die Referenz gebunden wird, solange wir die Referenz.

    In obigem Fall haben wir es gar nicht mit einem temporären Objekt zu tun (und test selbst wird direkt gebunden). In der Funktion wird am Ende ganz normal zerstört, der Rückgabewert verweist anschließend nicht mehr auf ein Objekt: folglich undefiniertes Verhalten bei der Initialisierung von test außerhalb der Funktion.



  • Wenn das gehen sollte, müsste der Compiler das selbstständig so umstellen, dass es auf dem Heap erzeugt wird und das wird er nicht machen. Auf dem Stack kann es ja nicht bleiben, was klar sein sollte, wenn man sich anschaut wie das mit dem Stack funktioniert.


Log in to reply