Der folgende Code erzeugt einen Dangling-Verweis, wie in der Warnung des Compilers und der Tatsache, dass der Destruktor für das Objekt A
in der Funktion g()
aufgerufen wird, bevor die Funktion zurückkehrt, angezeigt wird. Man kann auch überprüfen, dass in main()
nach dem "Verwenden des Stapels" die zurückgegebene Referenz zumindest in einem Debug-Build Müll aufweist. Aber ich konnte das gleiche Verhalten in einem Release-Build nicht reproduzieren. Warum das? Welche Art von Optimierung macht der Compiler hier, um den Eindruck zu erwecken, dass die Referenz r
Ok ist?Was passiert mit dem Snippet in einem Release-Build?
#include <iostream>
struct A{
A(int i) : i(i) { std::cout << "Ctor\n"; }
A(const A& a) { i = a.i; std::cout << "Copy ctor\n"; }
~A() { std::cout << "Dtor\n"; }
int i;
};
A& g(int i) { A x(i); return x; }
int main()
{
const A& r = g(1);
std::cout << "Using the stack\n";
std::cout << r.i << '\n'; // r.i has garbage in debug, but not in a release build.
}
PS. Ich würde gegen NRVO argumentieren, da die Funktion kein A
Objekt zurückgibt.
Edit: Als Antwort auf Mark Tolonen. Auch wenn ich diese Ausdrücke nach const A& r = g(1);
das Release-Build enthalten nicht zeigt Müll in std::cout << r.i << '\n';
std::cout << "Using the stack ...................................................................................................................\n";
std::cout << "Using the stack ...................................................................................................................\n";
std::cout << "Using the stack ...................................................................................................................\n";
std::cout << "Using the stack ...................................................................................................................\n";
Undefiniertes Verhalten ist undefiniert ... (Ausgänge 1 für mich in Freigabe und Debug) – jrok
**** VS2010 **** – WaldB
Überprüfung der Demontage. Es ist optimiert, entweder im Register oder verwenden Sie sofort. – Immueggpain