free()不解除内存?

时间:2012-05-06 18:34:34

标签: c memory-management free

free(str);
printf("%d\n", str->listeners);

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

5 个答案:

答案 0 :(得分:4)

这里有一个类比:想象你租了一套公寓(那是记忆)然后你终止你的租约,但保留一把钥匙(这就是指针)。如果没有拆除,可能可以再次进入公寓,如果没有更换锁等等,如果你马上就做了可能以你离开他们的方式找到东西。但这是一个非常糟糕的主意,在可能的情况下,你会陷入一堆麻烦......

答案 1 :(得分:2)

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

答案 2 :(得分:2)

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

内存已被释放,但主动清除它没有意义,因此其原始内容可能仍然存在。但你不能依赖它。

答案 3 :(得分:1)

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

答案 4 :(得分:0)

要记住的事情......

  • 在几乎所有当前操作系统上,free()永远不会返回 内存到操作系统。即使它在理论上有能力 那,它几乎从未真正发生过。这是因为记忆可以 只能在4kB的对齐页面中返回,因为那是怎么回事 MMU的工作原理,如果找到一个,可能会将其剥离 片段包含在其上方和下方的内存的块,制作 整个过程适得其反。 (碎片化是有效使用动态内存的敌人。)
  • 此外,大多数程序只是一般 使用更多的内存,所以花时间搜索真正的东西 返回操作系统将完全浪费。如果它没有回馈给 操作系统然后受到保护,当您触摸它时,它不会使您的程序成为核心。
  • 相反,会发生什么 你给予免费的块只是放在一个列表或其他一些 数据结构,然后可能合并到它上面或下面的块中。
  • 内存仍在那里且可以访问。一些块可能是 用指针和库代码的其他内部构造覆盖 在malloc()和free()之后。但它可能不是。
  • 最终可能是 在你的程序的其他地方交还。但它可能不是。