free(str);
printf("%d\n", str->listeners);
对printf的调用成功(与str成员的任何其他调用一样)。这怎么可能?
答案 0 :(得分:4)
这里有一个类比:想象你租了一套公寓(那是记忆)然后你终止你的租约,但保留一把钥匙(这就是指针)。如果没有拆除,可能可以再次进入公寓,如果没有更换锁等等,如果你马上就做了可能以你离开他们的方式找到东西。但这是一个非常糟糕的主意,在可能的情况下,你会陷入一堆麻烦......
答案 1 :(得分:2)
这称为未定义的行为。您正在取消引用指向已释放内存的指针。任何事情都可能发生,即人们不能认为程序会崩溃或其他任何事情;行为未定义。
答案 2 :(得分:2)
你只是(不)幸运。该代码表现出未定义的行为 - 任何事情都可能发生,包括看起来没有释放内存。
内存已被释放,但主动清除它没有意义,因此其原始内容可能仍然存在。但你不能依赖它。
答案 3 :(得分:1)
只要str
不是NULL
并且相应的内存没有被其他分配覆盖它仍然有效,因为内存内容不会被free
更改(如果运行时不会覆盖free
上的内存区域。但这绝对是未定义的行为,你不能依赖它以这种方式工作......
答案 4 :(得分:0)
要记住的事情......
free()
永远不会返回
内存到操作系统。即使它在理论上有能力
那,它几乎从未真正发生过。这是因为记忆可以
只能在4kB的对齐页面中返回,因为那是怎么回事
MMU的工作原理,如果找到一个,可能会将其剥离
片段包含在其上方和下方的内存的块,制作
整个过程适得其反。 (碎片化是有效使用动态内存的敌人。)