【问题标题】:What is a “memory stomp”?什么是“记忆脚印”?
【发布时间】:2012-11-20 02:19:46
【问题描述】:

我刚来across this blog post,里面提到了“跺脚记忆”:

一个 C++ 程序,它可以轻松地跺内存 (如果你是你可能从未听说过的东西 出生于托管代码世界。)

其实我从来没有听说过!

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

【问题讨论】:

标签: c++ c memory memory-management


【解决方案1】:

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

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

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

【讨论】:

  • Here 是内存踩踏的好例子。
【解决方案2】:

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

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

将“践踏”buffer 之后内存中的下一件事。一般来说,“跺脚”是指内存被无意写入。

【讨论】:

    【解决方案3】:

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

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

    我认为这是展示记忆“踩踏”的好例子。

    【讨论】:

    • 有另一个线程,在不同的操作系统上讨论几乎相同的例子......stackoverflow.com/questions/31016660
    • @Christian 它与操作系统无关。这是一种未定义的行为。
    猜你喜欢
    • 1970-01-01
    • 2018-05-02
    • 2018-06-03
    • 2019-09-27
    • 2014-05-11
    • 2011-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多