warning C4172: returning address of local variable or temporary



  • Hi,

    ich bekomme bei folgendem Template die oben genannte Warnung:

    template<typename T> inline const T& square (const T& value)
    { return (value * value); }
    
    // [...]
    
    int x = 44;
    x = square (x);
    

    Ich habe die Theorie das es an der Referenz liegt die zurück gegeben werden soll. Aber in Scott Meyers "Effektiv C++ Programmieren" wird das doch genau so gemacht in der Einführung bei Thema "templates vs. #define".



  • Richtig liegt an der Referenz.

    return (value * value)
    

    Es wird ein temporäres Objekt angelegt und eine Refernz auf dieses Objekt zurückgegeben, dann wird das Objekt zerstört.
    Du hast also eine Referenz auf ein ungültiges Objekt.

    Ich weiß nicht, wieso soetwas in deinem Buch steht.
    Du solltest die Rückgabe per Wert machen.

    Gruß
    Don06



  • Template-User schrieb:

    Hi,

    ich bekomme bei folgendem Template die oben genannte Warnung:

    template<typename T> inline const T& square (const T& value)
    { return (value * value); }
    

    Das letzte Statement erzeugt eine lokale Kopie (auf dem Stack) und gibt eine Referenz darauf zurück. Nach dem Ende der Funktion wird die Kopie gelöscht (und der Stackpointer zurückgesetzt) und die Referenz zeigt somit ins Leere.

    Bau doch mal in den ctors/dem dtor einer Klasse mit der Du das Template instantiierst Testausschriften ein; dann siehtst Du besser was genau passiert.

    Grüsse

    *this



  • Don06 schrieb:

    Richtig liegt an der Referenz.

    return (value * value)
    

    Es wird ein temporäres Objekt angelegt und eine Refernz auf dieses Objekt zurückgegeben, dann wird das Objekt zerstört.
    Du hast also eine Referenz auf ein ungültiges Objekt.

    Ich weiß nicht, wieso soetwas in deinem Buch steht.
    Du solltest die Rückgabe per Wert machen.

    Gruß
    Don06

    soweit ich weiss schreibt er in effective c++ eher das gegenteil,
    das man das so nicht machen sollte 🙂



  • Btw *this in einer Methode als Referenz zurückzugeben ist ganz anders einzuschätzen! Das Objekt (*this) lebt nämlich meist lange genug!

    Grüsse

    *this



  • inp schrieb:

    soweit ich weiss schreibt er in effective c++ eher das gegenteil,
    das man das so nicht machen sollte 🙂

    Ahh... Das erklärt natürlich einiges. Dachte auch schon: Was ist das denn für ein Buch? Naja, man sollte auch ein Buch lesen und nicht nur Copy&Paste des Codes machen.

    Gruß
    Don06


Anmelden zum Antworten