0

重複の可能性:
ローカル変数のメモリにそのスコープ外でアクセスできますか?

自動メモリの割り当てが解除されたとき?

void fun3(int a){
    a = 5;
}

関数の終了時に 'a' は解放されますか?

はい !

では、この出力の理由は何ですか? http://ideone.com/2ZJ57

4

3 に答える 3

2

技術的には、保存されたメモリはa他のコンテキストで利用できるので、あなたの質問に答えるには、はい。

ただし、これはいくつかの要因に依存します。語るべき記憶さえないかもしれない。あなたの特定の例では、オプティマイザーはすべてを切り取るだけかもしれません。のようなことをしても、メモリに存在しないインライン化される可能性がありますcout << a5

参照渡しの場合、有効期間は元の変数の有効期間であることに注意してください。

また、割り当てが解除されたからといって、後でメモリが自動的に消去されるわけではありません。そのメモリが再利用されるまで、値はまだそこに存在する可能性があります。

あなたの例は未定義の動作を示します:

void fun3(int *&p, int a){
        p = &a;
}

aはローカル変数であり、そのアドレスを取得して に代入しp、それを関数の外で使用します。何でも起れる。

于 2012-04-28T14:39:23.423 に答える
1

Yesaは、関数のスコープが終了すると解放されます。

では、この出力の理由は何ですか?
変数が存在するスコープを超えたメモリ位置へのポインターを介して自動変数の内容にアクセスすることは、標準では未定義の動作です。

あなたのプログラムはまさにそれを行うので、Undefined Behavior(UB)を持っています。UB を使用すると、プログラムは有効または無効なRef 1の任意の動作を示すことができます。

参照 1 C++03 セクション 1.3.24:

許容される未定義の動作は、状況を完全に無視して予測不可能な結果を​​もたらすことから、翻訳中またはプログラム実行中に環境に特有の文書化された方法で動作すること (診断メッセージの発行の有無にかかわらず)、翻訳または実行の終了 (診断メッセージの発行を伴う) にまで及びます。診断メッセージの)。

于 2012-04-28T14:38:06.073 に答える
1

はい、割り当てられたストレージはa、関数が終了すると割り当てが解除されます。

于 2012-04-28T14:39:12.950 に答える