【问题标题】:free() not deallocating memory?free() 不释放内存?
【发布时间】:2012-05-15 10:21:39
【问题描述】:
free(str);
printf("%d\n", str->listeners);

对 printf 的调用成功(与对 str 成员的任何其他调用一样)。这怎么可能?

【问题讨论】:

标签: c memory-management free


【解决方案1】:

这是一个类比:假设您正在租一间公寓(即内存)并且您终止了租约但保留了密钥的副本(即指针)。你可能以后可以回到公寓,如果它没有被拆除,如果锁没有被更换,等等,如果你马上这样做,你可能 以您离开时的方式找到东西。但这是一个非常糟糕的主意,而且在可能的情况下,你会让自己陷入一堆麻烦中...​​...

【讨论】:

    【解决方案2】:

    你只是(不)幸运。该代码表现出未定义的行为 - 任何事情都可能发生,包括看起来内存没有被释放。

    内存被释放了,但是没有必要主动清除,所以它的原始内容很可能还在。但你不能依赖它。

    【讨论】:

      【解决方案3】:

      这称为未定义行为。您正在取消引用指向已释放内存的指针。任何事情都可能发生,也就是说,不能假设程序会崩溃或发生其他任何事情;行为未定义

      【讨论】:

        【解决方案4】:

        只要str 不是NULL 并且相应的内存没有被其他分配覆盖,它仍然可以工作,因为内存内容没有被free 更改(如果运行时没有覆盖free 上的内存区域)。但是这绝对是未定义的行为,您不能依赖它以这种方式工作......

        【讨论】:

        • 嗯,它可以free()更改。关键是这个程序的行为是未定义的。
        • @EdS。这就是我在最后一句中写的!
        • 你在事后添加了。我对您的原始帖子投了反对票。如果您不想要反对票,请不要着急:) 反对票已删除
        • @EdS。如果在第一分钟左右继续编辑我自己的帖子是“事后”,那么我有罪......
        • 嗯...是的:D。在您进行编辑之前,我看到了您的原始答案。我还需要提供哪些其他信息?我是否应该假设您将来某个时候会对其进行编辑以使其正确?
        【解决方案5】:

        注意事项...

        • 在几乎所有当前操作系统上,free() 永远不会返回 内存到操作系统。即使理论上可以 那,它几乎永远不会真正发生。这是因为内存可以 仅在通常为 4kB 的对齐页面中返回,因为这就是 MMU 可以工作,而且,如果找到一个,很可能会将其撕掉 将包含其上方和下方内存的块分段,使 整个过程适得其反。 (碎片化是有效利用动态内存的敌人。)
        • 另外,大多数程序只是一般 使用更多的内存,所以花时间寻找真正的东西 返回操作系统将完全被浪费。如果不归还给 操作系统,然后受到保护,当您触摸它时,它不会核心您的程序。
        • 因此,发生的事情是 你给免费的块只是放在一个列表或其他一些 数据结构,然后可能合并到其上方或下方的块中。
        • 内存仍然存在并且可以访问。某些块可能是 用指针和库代码的其他内部结构覆盖 在 malloc() 和 free() 之后。但可能不是。
        • 最终可能是 在你的程序的其他地方交还。但可能不是。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-07-18
          • 2011-05-31
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-09-26
          相关资源
          最近更新 更多