私は「記憶を踏み鳴らす」について言及しているこのブログ投稿に出くわしました:
メモリを簡単に踏み付けることができるC ++プログラム(マネージコードの世界で生まれた場合、おそらく聞いたこともないもの)
そして実際、私はそれについて聞いたことがありません!
それで、これは何ですか、メモリを踏み鳴らして、メモリを踏みつけますか?いつ発生しますか?
私は「記憶を踏み鳴らす」について言及しているこのブログ投稿に出くわしました:
メモリを簡単に踏み付けることができるC ++プログラム(マネージコードの世界で生まれた場合、おそらく聞いたこともないもの)
そして実際、私はそれについて聞いたことがありません!
それで、これは何ですか、メモリを踏み鳴らして、メモリを踏みつけますか?いつ発生しますか?
回答:
コードの一部が競合する方法で別のコードがそのメモリを使用していることを認識せずにメモリを操作すると、メモリは「踏みにじられ」ます。メモリを踏みつける一般的な方法はいくつかあります。
1つは、たとえば100バイトのメモリを割り当てますが、100番目のアドレスを超えて何かを格納します。このメモリは、まったく異なるものを保持するために使用される場合があります。何かが踏みつけられた犠牲者に何かがアクセスしようとすると問題が発生し、踏みつけられたコードはまったく無関係である可能性があるため、これは特にデバッグが困難です。
もう1つは、解放後にメモリにアクセスしています。メモリは別のオブジェクトに割り当てられます。この場合も、問題を示すコードは、同じアドレスを取得した新しく割り当てられたオブジェクトに関連していて、問題の原因となったコードには関連していない可能性があります。
他の答えは基本的に正しいですが、例を挙げたいと思います。
int a[10], i;
for (i = 0; i < 11 ; i++)
a[i] = 0;
int i, a[10];
for (i = 0; i < 11 ; i++)
a[i] = 0;
これらのサンプルは、未定義の動作であるため、無限ループになる可能性があります(または、導かれない場合があります)。
おそらくi
メモリ内の変数は配列の直後に格納されます。したがって、アクセスa[10]
すると、実際i
にはループカウンターがリセットされる可能性があります。
記憶の「踏みつけ」を示す良い例だと思います。