2012-12-02 5 views
86

は、私はちょうど「のメモリを踏み」に言及across this blog postを来た:「メモリ・ストンプ」とは何ですか?

メモリ (あなたはおそらくも、あなたは、マネージコードの世界に生まれ た場合のことを聞いたことがない何かを踏みの簡単可能であるC++プログラム。 )

実際、私はそれについて聞いたことがありません!

これは何ですか、メモリストンプ、メモリのストンプ?それはいつ起こるのですか?

+4

メモリストンプの良い例は、この質問です:http://stackoverflow.com/questions/31016660/why-is-my-for-loop-not-breaking-code –

答えて

109

他のコードがそのメモリを競合する方法で使用していることを認識せずにコードの一部がメモリを操作すると、メモリが "踏み外され"ます。メモリをスムーズにするには、いくつかの一般的な方法があります。

たとえば、100バイトのメモリを割り当てていますが、100番目のアドレスを超えて何かを格納しています。このメモリは、まったく異なるものを保持するために使用される可能性があります。これは特に、デバッグが困難です。なぜなら、何かが踏み込まれた犠牲者にアクセスしようとしたときに問題が現れ、それを踏んだコードがまったく無関係かもしれないからです。

もう1つは解放された後にメモリにアクセスしています。メモリは、別のオブジェクトに割り当てられてもよい。ここでも、問題を示すコードは、同じアドレスを持ち、問題の原因となったコードとは無関係に新しく割り当てられたオブジェクトに関連している可能性があります。

+3

[Here](http:// stackoverflow.com/questions/31016660/why-does-this-for-loop-exit-on-some-platforms-and-not-on-others)はメモリストンプングの良い例です。 –

32

非常に頻繁にバッファオーバーランです。一例として、このコード:

char buffer[8]; 
buffer[8] = 'a'; 

意志buffer後にメモリ内の次のものであることを起こるものは何でも上の「ストンプ」。一般に、「ストンプする」とは、メモリが意図せずに書き込まれる場合です。

8

その他の回答は基本的には正しいですが、私は例を挙げたいと思います。それは未定義の動作であるため

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にアクセスできる可能性があります。つまり、ループカウンタをリセットできます。

メモリ "ストンプ"を実証するのが良い例だと思います。

+0

他のスレッドがあり、異なるオペレーティングシステムで同じ例をかなり議論しています... http://stackoverflow.com/questions/31016660 – Christian

+1

@ChristianそれはOSとは関係ありません。これは未定義の動作です。 – ST3

関連する問題