什么是“记忆跺脚”?
我刚刚遇到这个提到“跺脚”的博客文章 :
一个很容易跺脚内存的C ++程序(如果你出生在一个托pipe代码世界,你可能从来没有听说过)。
其实我从来没有听说过!
那么,这是什么,一个记忆跺脚,跺脚的记忆? 什么时候发生?
当一段代码操作内存时,内存被“跺脚”,而没有意识到另一段代码正在以冲突的方式使用内存。 内存有几种常见的方式可以踩踏。
一个是分配100字节的内存,然后存储超过第100个地址的内容。 这个记忆可能被用来保存完全不同的东西。 这是特别难以debugging的,因为当某些东西试图访问被踩踏的受害者时,问题就会出现,而踩踏它的代码可能完全不相关。
另一个是在释放内存后访问内存。 内存可能被分配给另一个对象。 再次,显示问题的代码可能与新分配的对象具有相同的地址,而与导致问题的代码无关。
很多时候它是一个缓冲区溢出; 作为一个例子,这个代码:
char buffer[8]; buffer[8] = 'a';
将“跺脚”在buffer
之后的内存中的下一件事。 一般来说,“跺脚”就是无意中写入内存的时候。
其他答案基本上是正确的,但我想举个例子。
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;
这些样本可能会导致无限循环(或者可能不会导致),因为它是未定义的行为。
内存中的variables很可能是在数组后面存储的。 所以访问a[10]
实际上可以访问i
换句话说它可以重置循环计数器。
我认为这是展示记忆“跺脚”的好例子。