99

我刚刚看到这篇博客文章,其中提到了“跺脚记忆”:

一个 C++ 程序,它可以轻松地占用内存(如果您出生在托管代码世界中,您可能从未听说过。)

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

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

4

3 回答 3

120

当一段代码在没有意识到另一段代码正在以一种冲突的方式使用该内存的情况下操作内存时,内存就会被“踩踏”。有几种常见的方法可以压制记忆。

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

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

于 2012-12-02T12:43:45.337 回答
34

很多时候是缓冲区溢出;例如,这段代码:

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

将“踩”在buffer. 一般来说,“跺脚”是指无意中写入内存。

于 2012-12-02T12:42:56.340 回答
10

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

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,换句话说,它可以重置循环计数器。

我认为这是一个很好的例子,展示了记忆“跺脚”。

于 2015-07-14T08:41:02.047 回答