2012-05-06 139 views
0
free(str); 
printf("%d\n", str->listeners); 

对printf的调用成功(就像其他对str成员的调用一样)。这怎么可能?免费()不释放内存?

+0

你预期会发生什么? –

+0

你之前用'str'做过什么? – qwertz

+0

强制链接:http://stackoverflow.com/a/6445794/11683 – GSerg

回答

2

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

内存已释放,但没有积极清除它的意义,所以它的原始内容可能仍然存在。但你不能依赖这一点。

2

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

1

只要strNULL和相应的内存没有被一些其他配置覆盖它仍然有效,因为内存的内容不受到free改变(如果运行时不会覆盖上free存储区域) 。但这是明确的未定义的行为,你不能依靠它来这样工作...

+0

嗯,它*可以*由'free()'改变。关键是这个程序的行为是不确定的。 –

+0

@EdS。这是我在最后一句中写的! – Yahia

+0

你在事后补充说。我低估了你原来的帖子。如果你不想downvotes不急于它:) Downvote删除 –

4

这里有一个比喻为你:想象你租用一个公寓(这是内存),你终止你的租约,但保持重复(这是指针)。你可能如果它还没有被拆除,如果锁没有被改变等,并且如果你马上去做可能可以找到你离开的方式他们。但是,这是一个非常糟糕的主意,并在可能的情况下,你要自己弄一堆麻烦......

+2

+1。 – Dani

0

事情要记住...

  • 几乎所有当前的操作系统,free()永远不会返回 内存到操作系统。即使它理论上有能力,它几乎不会实际发生。这是因为内存 只能以对齐的页面返回,通常为4kB,因为MMU的工作方式就是这样,而且如果找到其中的一个,则将其拆分出来可能会将包含高于和低于其的内存的块分段,使整个过程适得其反。 (碎片化是动态内存高效利用的敌人。)
  • 此外,大多数程序只是使用更多的内存,所以花费的时间搜索的东西真的 返回到操作系统将被完全浪费。如果它没有返回到 操作系统,然后受到保护,那么当您触摸它时,它不会核心您的程序。
  • 所以相反,会发生什么是 你给的空闲块只是放在一个列表或其他一些 数据结构,然后可能合并到其上方或下方的块。
  • 内存仍然存在并且可以访问。某些块可能是 ,它们覆盖在malloc()和free()后面的库代码 的指针和其他内部部分。但它可能不是。
  • 最终它可能是 在您的程序的其他地方回传。但它可能不是。