什么是“记忆重击”?


Answers:


117

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

一种是分配例如100字节的内存,然后再存储第100个地址之后的内容。该内存可能用于保存完全不同的内容。这特别难以调试,因为当某些东西尝试访问被踩踏的受害者时,问题就会出现,并且踩踏在其上的代码可能完全不相关。

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


3
是内存重载的好例子。
patryk.beza 2015年

33

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

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

会“踩”到内存中下一件事buffer。一般来说,“踩踏”是指无意中写入内存。


9

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

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

我认为这是一个很好的例子,展示了内存“踩踏”。


1
有花药线程,在不同的操作系统上讨论了几乎相同的示例... stackoverflow.com/questions/31016660
Christian

2
@Christian与操作系统无关。这是未定义的行为。
ST3
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.