什么是“记忆踩踏”?

时间:2012-12-02 12:37:37

标签: c++ c memory memory-management

我刚来across this blog post提到“踩踏记忆”:

  

一个很容易踩踏内存的C ++程序       (如果你是的话,你可能从未听说过的话       出生于托管代码世界。)

事实上我从未听说过它!

那么,这是什么,内存踩踏,踩踏内存?什么时候发生?

3 个答案:

答案 0 :(得分:113)

当一段代码操纵内存而没有意识到另一段代码以一种冲突的方式使用该内存时,内存被“踩踏”。有几种常见的方法可以踩踏内存。

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

另一个是在释放后访问内存。可以为另一个对象分配存储器。同样,显示问题的代码可能与新分配的对象有关,该对象具有相同的地址,与导致问题的代码无关。

答案 1 :(得分:32)

通常是缓冲区溢出;例如,这段代码:

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

会在buffer之后“踩踏”内存中的下一件事。一般来说,'stomping'就是无意中写入内存的时候。

答案 2 :(得分: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,换句话说,它可以重置循环计数器。

我认为这是一个很好的例子,可以演示记忆&#34; stomping&#34;。