9

メモリリークに関連するものを研究しているときに、ネット上でこれに出くわしました。

int* Function()

{

   int arrays[10];

     /* Some code here */

   return &(arrays[0]);

}

著者によると、上記のコードは有効ですが、返されたメモリは次に呼び出す関数で再利用されるため、同じメモリが 2 つの目的で使用されます。これは「ハンギングリファレンス」と呼ばれ、恐ろしく断続的な障害、または昔ながらの「一般保護障害」を引き起こす可能性があります。

誰かが「ぶら下がっている参照」と「一般的な保護違反」とは何かを説明できれば素晴らしいと思います

4

3 に答える 3

2

これらが公式の説明であるかどうかはわかりませんが、この例により良い意味を与えることを願っています:

ハンギング参照: return ステートメントは、配列への参照 (ポインター) を返します。ただし、メモリは関数が閉じた後に削除される (または削除される可能性がある) ため、割り当てられたメモリを指していない参照が存在します。これはハンギング参照と呼ばれます。

これにより、一般保護違反が発生する可能性があります。一般に、割り当てられていないメモリに書き込むべきではありません。これを行おうとすると、オペレーティング システムによって一般保護違反が発生する可能性があります。

于 2013-04-18T10:27:03.120 に答える
2

arraysFunctionが呼び出されると、スタックに割り当てられます。Functionスタックに割り当てられた構造体のアドレスを返します。返されるとFunction、スタック ポインターはポップバックされますが、そのデータはまだスタックにあります。以前に解放されたスタックの領域が別の関数またはスコープによって使用される場合、その関数は、以前に返されたポインターからまだアクセスできる可能性があるスタックの一部に、そのローカル スコープ データを書き込みます。

これには 2 つの結果があります。

  • 外部から配列データにアクセスしようとするとFunction、それらのデータは信頼できなくなり、そのスタック領域を上書きする新しい割り当てによって (近いうちに) 破損します。
  • スタックに割り当てられた新しい関数は、すべてのフィールドを初期化しない場合、ダーティ データを含む可能性があります。

結果は未定義の動作であり、コンパイラとコンパイル オプションにも依存する可能性があります。

于 2013-04-18T10:27:26.317 に答える