可能性の重複:
Can a local variable's memory be accessed outside its scope?自動メモリの割り当てが解除されていますか?
自動メモリー割り当て解除?
void fun3(int a){
a = 5;
}
機能終了時に 'a'は割り当て解除されますか?
はい!
だから、この出力の理由は何ですか? http://ideone.com/2ZJ57
可能性の重複:
Can a local variable's memory be accessed outside its scope?自動メモリの割り当てが解除されていますか?
自動メモリー割り当て解除?
void fun3(int a){
a = 5;
}
機能終了時に 'a'は割り当て解除されますか?
はい!
だから、この出力の理由は何ですか? http://ideone.com/2ZJ57
はいa
は、機能の有効範囲が終了すると割り当てが解除されます。
この出力の理由は何ですか?
変数が存在するスコープを超えたメモリ位置へのポインタを介して自動変数の内容にアクセスすることは、標準に従って未定義の動作です。
あなたのプログラムはそれと全く同じですので、未定義の振る舞い(UB)があります。 UBを使用すると、プログラムは有効または無効の動作をすべて表示できますRef 1。
文献1C++ 03セクション1.3.24:
許容未定義の動作は、文書に変換またはプログラム実行中に動作に、予期しない結果で完全に状況を無視しての範囲(診断メッセージの発行の有無にかかわらず)環境の特徴的なやり方で、(診断メッセージの発行を伴い)翻訳または実行を終了する。
はい、関数が終了すると、a
に割り当てられた記憶域が割り当て解除されます。
技術的には、a
が保存されていたメモリは他のコンテキストでも利用できます。
これはいくつかの要因にもよりますが、そこにはかもしれません。は話すことさえできません。あなたの特定の例では、オプティマイザはすべてをカットするかもしれません。 cout << a
のようなことをしても、5
がインラインでメモリに常駐していない可能性があります。
参照渡しの場合、有効期間は元の変数の有効期間です。
また、割り当てが解除されただけで、メモリが自動的に後でクリーニングされるわけではありません。その値は、そのメモリが再利用されるまでそこに存在する可能性があります。
あなたの例 exibits未定義の動作:
void fun3(int *&p, int a){
p = &a;
}
a
はローカル変数であり、あなたはそのアドレスを取ると、あなたは、関数の外に使用され、p
に割り当てます。何でも起れる。
メモリアドレスを印刷できても、(合法的に)それを操作できるわけではありません。 –