2012-12-20 16 views
7

Powiel możliwe:
Returning the address of local or temporary variable
Can a local variable’s memory be accessed outside its scope?powracający odniesienia do zmiennej lokalnej

Nawet wiedząc, co się dzieje, jak wynika z poniższych snips pomocne byłoby zrozumieć, jak to się dzieje . Cztery kolejne pytania.

Dane:

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

i wiedząc, że w dalszej części odniesienie do lokalny nazwie i jest de-odwoływać do temp, który jest przypisany do intval i lokalny i znika na końcu foo()

int intVal = foo(); 

pierwsze pytanie - w dalszej części prawej stronie wyrażenia jest taki sam jak powyższy sposób jest to przypadek, w którym kompilator widzi lewą stronę i, w zależności od kontekstu, wie, że nie odwołuje się do zwróconego odniesienia, a zamiast tego tworzy z nim nowe odniesienie?

Drugie pytanie - i to samo powoduje, że lokalnie i trzyma się, podczas gdy intRef jest w zasięgu?

int& intRef = foo(); 

trzecie pytanie - mieszek IntPtr dostaje adres lokalnej i. Tak więc, czy kompilator używa kontekstu przypisania i decyduje się nie odwoływać, aby uzyskać wartość przed wzięciem adresu odniesienia (zamiast powiedzieć, że bierze adres tymczasowej wartości zawierającej odsyłacz)?

Czwarte pytanie - czy lokalne i kij dookoła, gdy intPtr jest w zakresie?

int* intPtr = &foo(); 
+2

Nie ma sensu wiedzieć, co się tutaj dzieje. FWIW, to * nigdy * nie kręci się wokół, aw pierwszym nie trzyma się wystarczająco długo, aby cokolwiek się wydarzyło. –

+0

Nie ma "a temp"! –

+0

możliwy duplikat: [Zwrot adresu zmiennej lokalnej lub tymczasowej] (http://stackoverflow.com/q/2744264/187543) – cpx

Odpowiedz

6

Nie, żadna z nich nie wydłuży czasu życia zmiennej lokalnej. Nic takiego nie będzie miało w C++. Lokalne obiekty w C++ działają do końca zakresu, w którym są zadeklarowane, koniec historii.

Jedyna zasada, która na pierwszy rzut oka, wydaje się podążać inne zasady to:

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 
} 

Oznacza to, że const odniesienia może przedłużyć żywotność o tymczasowego jest przypisany do niego.

Ale to wymaga, aby funkcja zwracała wartość, a nie referencję, i wywoływacza, aby powiązać zwracaną wartość z odniesieniem do stałej, z których żadna nie została wykonana w kodzie.

+0

"wymaga, aby funkcja zwracała wartość, a nie referencję" <- powinieneś zapisać to w czapkach, z pogrubioną czcionką! :) –

0

W żadnym przypadku (nie intVal, nie intRef, a nie int), i koniecznie musi pozostać po foo powrotach.

Wartość na stosie, który był poprzednio zajęty przez i, może, ale nie musi zostać zmieniona w dowolnym momencie, po powrocie foo.

Na przykład (w przypadku niektórych procesorów i O/Ses), najprawdopodobniej zostanie zmieniona przez każde kolejne wywołanie podprogramu i może zostać zmieniona, jeśli wystąpi przerwanie sprzętowe.

Powiązane problemy