2012-12-20 22 views
7

Mögliche Duplizieren:
Returning the address of local or temporary variable
Can a local variable’s memory be accessed outside its scope?Rückkehr Verweise auf lokale Variable

Auch zu wissen, was passiert, als ein Ergebnis der folgenden snips es wäre hilfreich, zu verstehen, wie es geschieht, . Vier Fragen folgen.

Gegeben:

int& foo() 
{ 
    int i = 1; 
    return i; 
} 

Und zu wissen, dass in den folgenden Verweis auf die lokalen namens i wird in eine temporäre dereferenziert, die INTVAL zugeordnet ist und lokale i verschwindet am Ende foo()

int intVal = foo(); 

Erste Frage - im folgenden wird die rechte Seite des Ausdrucks ist das gleiche wie oben ist, so Dies ist ein Fall, in dem der Compiler die linke Seite sieht und basierend auf dem Kontext weiß, dass die zurückgegebene Referenz nicht de-referenziert und stattdessen eine neue Referenz erstellt wird, die damit initialisiert wird?

Zweite Frage - und das allein macht die lokale i bleiben Sie herum, während intRef im Geltungsbereich ist?

int& intRef = foo(); 

Dritte Frage - Balg intPtr bekommt Adresse lokalen i. Also, verwendet der Compiler den Kontext der Zuweisung und entscheidet sich, nicht zu de-referenzieren, um einen Wert zu erhalten, bevor die Adresse der Referenz genommen wird (anstatt die Adresse einer Temperatur zu nehmen, die den Wert enthält, auf den verwiesen wird)?

Vierte Frage - nicht lokale i bleiben, um während intPtr in Rahmen ist?

int* intPtr = &foo(); 
+2

Es ist sinnlos zu wissen, was hier passiert. FWIW, es hält sich nie fest, und in der ersten bleibt es nicht lange genug, um etwas passieren zu lassen. –

+0

Es gibt keine "a temp"! –

+0

möglich duplizieren: [Rückgabe der lokalen oder temporären Variablenadresse] (http://stackoverflow.com/q/2744264/187543) – cpx

Antwort

6

Nein, keiner davon verlängert die Lebensdauer der lokalen Variablen. Nichts in C++ wird diesen Effekt haben. Lokale Objekte in C++ leben bis zum Ende des Bereichs, in dem sie deklariert sind, Ende der Geschichte.

Die einzige Regel, die auf den ersten Blick, verschiedene Regeln zu folgen scheint, ist dies:

int foo() { 
    return 42; 
} 

int main() { 
    const int& i = foo(); 
    // here, `i` is a reference to the temporary that was returned from `foo`, and whose lifetime has been extended 
} 

Das heißt, ein const Referenz die Lebensdauer eines temporären wird ihm zugeordneten erweitern können.

Aber das erfordert, dass die Funktion einen Wert zurückgibt, keine Referenz, und der Aufgerufene, um den Rückgabewert an eine const-Referenz zu binden, die beide in Ihrem Code nicht ausgeführt werden.

+0

"erfordert die Funktion, um einen Wert zurückzugeben, keine Referenz" <- Sie sollten dies in Großbuchstaben schreiben, mit einer fetten Schrift! :) –

0

In keinem Fall (nicht intVal, nicht intRef, und nicht intPtr) bleibt i notwendigerweise nach foo zurück.

Der Wert auf dem Stapel, der zuvor von i belegt war, kann oder kann nicht geändert werden, nachdem foo zurückkehrt.

Zum Beispiel (bei einigen CPUs und O/S) wird es wahrscheinlich durch einen nachfolgenden Aufruf eines Unterprogramms geändert und kann geändert werden, wenn ein Hardware-Interrupt auftritt.