7

重複の可能性:ローカル変数
または一時変数のアドレスを返す
ローカル変数のメモリにそのスコープ外でアクセスできますか?

次の切り取りの結果として何が起こるかを知っていても、それがどのように起こっているかを理解するのに役立ちます. 4 つの質問が続きます。

与えられた:

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

そして、以下では、i という名前のローカルへの参照が intVal に割り当てられた temp に逆参照され、ローカル iがfoo()の最後で消えることを知っています。

int  intVal = foo();

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

2 番目の質問 - これだけで、intRef がスコープ内にある間、ローカル iが固執しますか?

int& intRef = foo();

3 番目の質問 - 次のintPtrはローカル iのアドレスを取得します。それで、コンパイラは割り当てのコンテキストを使用し、参照のアドレスを取得する前に値を取得するために逆参照しないことを決定していますか(逆参照された値を含む一時のアドレスを取得すると言うのではなく)?

4 番目の質問 - intPtrがスコープ内にある間、 local iは固執しますか?

int* intPtr = &foo();   
4

2 に答える 2

6

いいえ、それらのどれもローカル変数の寿命を延ばしません。C++ では、その効果はありません。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 参照にバインドする必要がありますが、どちらもコードでは行われません。

于 2012-12-20T21:03:26.163 に答える
0

いずれの場合も (intVal、intRef、および intPtr ではなく) i、foo が返された後も必ずしも残りません。

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

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

于 2012-12-20T21:06:52.777 に答える