什么是"记忆踩踏"?

scr*_*avy 92 c c++ memory memory-management

我刚刚看到这篇博文中提到了"踩踏记忆":

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

事实上我从未听说过它!

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

Dav*_*rtz 114

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

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

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

  • [这里](http://stackoverflow.com/questions/31016660/why-does-this-for-loop-exit-on-some-platforms-and-not-on-others)是内存踩踏的好例子. (3认同)

Iro*_*san 33

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

char buffer[8];
buffer[8] = 'a';
Run Code Online (Sandbox Code Playgroud)

将"踩踏"之后发生在内存中的下一件事情buffer.一般来说,'stomping'就是无意中写入内存的时候.


ST3*_*ST3 8

其他答案基本上都是正确的,但我想举个例子.

int a[10], i;       
for (i = 0; i < 11 ; i++)
    a[i] = 0;
Run Code Online (Sandbox Code Playgroud)
int i, a[10];     
for (i = 0; i < 11 ; i++)
    a[i] = 0;
Run Code Online (Sandbox Code Playgroud)

这些样本可能会导致无限循环(或可能不会导致),因为它是未定义的行为.

很可能i内存中的变量存储在数组之后.因此访问a[10]实际上可以访问i,换句话说它可以重置循环计数器.

我认为这是演示记忆"st脚"的好例子.

  • @Christian 这与操作系统无关。这是一个未定义的行为。 (2认同)