【发布时间】:2012-05-15 10:21:39
【问题描述】:
free(str);
printf("%d\n", str->listeners);
对 printf 的调用成功(与对 str 成员的任何其他调用一样)。这怎么可能?
【问题讨论】:
-
您预计会发生什么?
-
你之前对
str做了什么?
标签: c memory-management free
free(str);
printf("%d\n", str->listeners);
对 printf 的调用成功(与对 str 成员的任何其他调用一样)。这怎么可能?
【问题讨论】:
str做了什么?
标签: c memory-management free
这是一个类比:假设您正在租一间公寓(即内存)并且您终止了租约但保留了密钥的副本(即指针)。你可能以后可以回到公寓,如果它没有被拆除,如果锁没有被更换,等等,如果你马上这样做,你可能 以您离开时的方式找到东西。但这是一个非常糟糕的主意,而且在可能的情况下,你会让自己陷入一堆麻烦中......
【讨论】:
你只是(不)幸运。该代码表现出未定义的行为 - 任何事情都可能发生,包括看起来内存没有被释放。
内存被释放了,但是没有必要主动清除,所以它的原始内容很可能还在。但你不能依赖它。
【讨论】:
这称为未定义行为。您正在取消引用指向已释放内存的指针。任何事情都可能发生,也就是说,不能假设程序会崩溃或发生其他任何事情;行为未定义。
【讨论】:
只要str 不是NULL 并且相应的内存没有被其他分配覆盖,它仍然可以工作,因为内存内容没有被free 更改(如果运行时没有覆盖free 上的内存区域)。但是这绝对是未定义的行为,您不能依赖它以这种方式工作......
【讨论】:
free()更改。关键是这个程序的行为是未定义的。
注意事项...
free() 永远不会返回
内存到操作系统。即使理论上可以
那,它几乎永远不会真正发生。这是因为内存可以
仅在通常为 4kB 的对齐页面中返回,因为这就是
MMU 可以工作,而且,如果找到一个,很可能会将其撕掉
将包含其上方和下方内存的块分段,使
整个过程适得其反。 (碎片化是有效利用动态内存的敌人。)【讨论】: