【问题标题】:malloc / free. can read from freed memorymalloc/免费。可以从释放的内存中读取
【发布时间】:2012-03-29 05:54:06
【问题描述】:

我是如何分配内存的

char *convertToPostfix(char **infixExpr)
{
    char *postfixExpr = (char *) malloc(strlen(*infixExpr) * sizeof(char) * 2);
    ...
    return postfixExpr;
}

这是我如何使用此内存的:

char *subexpr = convertToPostfix(infixExpr);
free(subexpr);
while (*subexpr) 
    postfixExpr[i++]=*subexpr++;

为什么这个程序在free(subexpr);之后正常运行 我的意思是为什么释放后可以迭代?

当函数返回一些内存并在另一个上下文中释放时,我是否以这种方式正确地工作?

【问题讨论】:

  • 参见 stackoverflow.com/a/6445794/1025391(标记为 C++,但也主要适用于您的情况)
  • 修复代码中的错误,谜团就会消失。有缺陷的代码会做一些奇怪且不可预测的事情,这并不奇怪。

标签: c memory-management malloc free


【解决方案1】:

您的程序表现出未定义的行为。简而言之,任何事情都可能发生,包括您的程序似乎可以工作。

在您调用free 后,malloc/free 的实现不会立即将内存块返回到底层操作系统,这是很常见的。这样做是出于性能原因。对malloc 的下一次调用可能会通过返回指向您刚刚释放的块的指针并因此重新使用它来最有效地处理。此时,在您的代码中,将有两个指针指向同一个内存块,谁知道接下来会发生什么。

【讨论】:

    【解决方案2】:

    不要使用它!由于程序员依赖于声明为未定义的某些行为,其他程序员应该稍后重现其他错误。

    http://www.joelonsoftware.com/articles/fog0000000054.html

    Windows 95?没问题。不错的新 32 位 API,但它仍然可以完美地运行旧的 16 位软件。微软对此非常着迷,花费了大量的更改测试他们可以在 Windows 95 上找到的每个旧程序。为 Windows 3.x 编写 SimCity 原始版本的 Jon Ross 告诉我,他不小心在 SimCity 中留下了一个错误,他读取他刚刚释放的内存。是的。它在 Windows 3.x 上运行良好,因为内存从不去任何地方。这是令人惊奇的部分:在 Windows 95 的 beta 版本中,SimCity 无法进行测试。微软追踪了这个漏洞,并在 Windows 95 中添加了寻找 SimCity 的特定代码。如果它发现 SimCity 正在运行,它会以一种不会立即释放内存的特殊模式运行内存分配器。正是这种对向后兼容性的痴迷让人们愿意升级到 Windows 95。

    【讨论】:

      【解决方案3】:

      从/向已释放的内存读取/写入是未定义的行为。你的程序可能今天运行,明天崩溃;或者等到下一个满月再坠毁。

      它似乎工作的原因是堆管理器尚未将该内存分配给malloc() 的另一个调用者。并且free() 没有修改内存的现有内容,因此在调用free() 之前您写入这些位置的任何内容都仍然存在。但依赖这种行为是灾难的根源。

      【讨论】:

        【解决方案4】:

        这是未定义的行为。它似乎有效,但实际上任何事情都可能发生。

        它似乎工作的原因(可能)是当您调用free 时内存没有被清除,而是被操作系统标记为可重用。

        【讨论】:

          【解决方案5】:

          这显然是未定义的行为。

          释放内存并不意味着将其归零。大多数时候,记忆会 只需标记为“可用”。当您在释放后立即使用它时,它仍然是 那里完好无损。但是如果由于某种原因需要更多的内存,它可能会 被覆盖。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2021-04-28
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-08-26
            • 2015-09-10
            • 2010-12-04
            相关资源
            最近更新 更多