2012-12-02 39 views
86

我刚来across this blog post其中提到“跺脚记忆”:什么是“记忆跺脚”?

一个C++程序,它是能够方便地跺脚内存 (你可能从来没有听说过,如果你是 出生在一个托管代码的世界中。 )

而事实上我从来没有听说过它!

那么,这是什么,记忆跺脚,跺脚记忆?它什么时候发生?

+4

内存跺脚的一个很好的例子是这个问题:http://stackoverflow.com/questions/31016660/why-is-my-for-loop-not-breaking-code –

回答

109

当一段代码操纵内存而没有意识到另一段代码正在以冲突的方式使用该内存时,内存被“跺脚”。有几种常见的方式可以让内存不堪重负。

一个是分配比如说100个字节的内存,但是然后存储超过第100个地址的内容。这个记忆可能被用来保存完全不同的东西。这是特别难以调试的,因为当某些东西试图访问被踩踏的受害者时,问题就会出现,而踩在它上面的代码可能完全不相关。

另一个是在释放内存后访问内存。内存可以分配给另一个对象。再次,显示问题的代码可能与获取相同地址并与导致问题的代码无关的新分配的对象有关。

+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它与操作系统无关。这是一个未定义的行为。 – ST3