【发布时间】:2016-03-20 23:38:42
【问题描述】:
我在讲座中被教导,在指针上调用free() 两次真的非常糟糕。我知道在释放它之后立即设置指向NULL 的指针是一种很好的做法。
但是,我仍然没有听到任何关于为什么会这样的解释。据我了解,malloc() 的工作方式在技术上应该跟踪它已分配并让您使用的指针。那么它为什么不知道它通过free() 接收到的指针是否已经被释放呢?
我很想了解,当您在之前已被释放的位置上调用 free() 时,内部会发生什么。
【问题讨论】:
-
指针只是你注释数据方向的地方,但你真正释放的是数据本身
-
@DanielSanchez 是的,但是由于 malloc 向您抛出了那个指针,内存释放/分配构造是否应该仍然注意到它已经释放了指针指向的位置?
-
如果在
free之后不使用指针,则将其设置为NULL是没有用的。 如果你在free之后使用指针,无论你是否将它设置为NULL,你都有未定义的行为。当然,如果您检查NULL,那么它会有所帮助,但是设置指向NULL的指针并不是您绝对必须要做的事情,请根据具体情况进行取决于你如何使用指针。 -
它可以搜索释放的块是否已经在空闲块列表中,但这会减慢不需要该功能的程序
-
可以把
malloc和free管理的堆内存看成一滩水。当您使用malloc分配内存时,您会得到一勺水,您可以随心所欲地使用它。当您free内存时,如果将一勺水倒回池中,您就会忘记哪个内存是您的,内存管理器也是如此。释放内存只会清空你的勺子,但你仍然保留实际的勺子(指针)。
标签: c pointers malloc free dynamic-memory-allocation