2012-12-20 9 views
7

可能性の重複:
Returning the address of local or temporary variable
Can a local variable’s memory be accessed outside its scope?返す参照

でも、次の結果は、起こっているかを理解するのに役立つだろう切れ端のように何が起こるのかを知ります。 4つの質問が続きます。

考える:

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

そして私に命名ローカルに次の参照はINTVALに割り当てられ、ローカルIはの終わりに消滅する一時にデ参照されていることを知りますのfoo()

int intVal = foo(); 

最初の質問 - 以下に、式の右辺は、そうである上記と同じですこれは、コンパイラが左辺を見て、コンテキストに基づいて、返された参照を逆参照しないことを知っています。代わりに、新しい参照を作成する代わりに、その参照で初期化されますか?

2番目の質問 - これだけで、ローカルiは、intRefが有効範囲内にあります。

int& intRef = foo(); 

3番目の質問 - 怒鳴るのIntPtrローカルIのアドレスを取得します。だから、コンパイラは、割り当てのコンテキストを使用し、参照のアドレスを取る前に値を取得するために参照解除しないことを決定します(de-referenced値を含むtempのアドレスを取るというよりも)か?

第4問 - ローカルiスティック回りintPtrは範囲内ですか?

int* intPtr = &foo(); 
+2

ここで何が起こるかを知るのは無意味です。 FWIW、それは決して回りません。そして、最初のものでは何かが起こるのに十分長く留まりません。 –

+0

「一時」はありません! –

+0

可能な重複:[ローカルまたは一時変数のアドレスを返す](http://stackoverflow.com/q/2744264/187543) – cpx

答えて

6

いいえ、それらのどれもローカル変数の有効期間を延長しません。 C++のNothingにはその旨が反映されます。 C++のローカルオブジェクトは、宣言されているスコープの終わりまで、ストーリーの終わりまで生きています。

ある
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 
} 

CONST参照がそれに割り当てられ一時の寿命を延長することができる:

一見、異なるルールに従うように思われる、唯一のルールは、これがあります。

しかし、これは関数が参照ではなく値を返し、呼び出し元が戻り値をconst参照にバインドする必要があり、どちらもコード内で行われません。

+0

"は、関数が値を返すように要求しています。" < - これを大文字で書くべきです。 :) –

0

fooが復帰した後でも、iは必ずしも固執しません(intValではなく、intRefでなくintPtrではありません)。

以前にiが占有していたスタックの値は、fooが返された後いつでも変更される場合もあれば、変更されない場合もあります。

たとえば、(CPUやO/Sesによっては)後続のサブルーチンの呼び出しによって変更される可能性があり、ハードウェア割り込みが発生すると変更される可能性があります。