これは私が話したいスナップショットです。このコードでは、main関数はローカルに宣言された変数 'a'のアドレスを返す 'foo'を呼び出します。私は、ローカルで宣言された変数が範囲外になったときにメモリの割り当てを解除するという印象を受けました。変数 'a'は、fooへの呼び出しが終了した後に割り当て解除され、 'a'に関連するものは残されてはいけません。しかし、この場合、その基本的な前提を壊しているようです。下には何が起こっていますか?ローカル変数とプログラムの戻りアドレスがまだ残っています
int* foo() {
int a = 5;
return &a;
}
int main() {
int* p = foo();
// Prints 5
std::cout << "Coming from foo = " << *p << std::endl;
*p = 8;
// Prints 8
std::cout << "Setting explicitly = " << *p << std::endl;
}
これは未定義の動作です。そのようなプログラムの予測可能な動作を考慮しないでください。 –
@RSahu。私はそれが未定義の動作であることを理解しています。これを別のマシンで(何度も)コンパイルしようとすると、私の疑惑が増えます。 –
スタックフレーム全体が必ずしも上書きされる必要はありませんが、コンパイラやスタックスペースの量、OSなどによって異なる場合があります。 – George