我有一个命令行C程序,我使用calloc()函数为一个结构分配一些内存,该结构也有一个结构体,并且分配了一些内存。使用后释放内存
如果我使用free()函数从父结构中释放内存,它是否也会从子结构释放内存?
或者我应该首先从子结构中释放内存?
我有一个命令行C程序,我使用calloc()函数为一个结构分配一些内存,该结构也有一个结构体,并且分配了一些内存。使用后释放内存
如果我使用free()函数从父结构中释放内存,它是否也会从子结构释放内存?
或者我应该首先从子结构中释放内存?
它是一个简单的规则,对于你所做的每个内存分配,你必须自己明确释放内存。所以,你需要自己释放孩子的记忆。
在释放父结构之前,你至少需要获取指向子内存的指针 - 确保代码不会访问释放的内存。或者,只需在父母面前释放子结构 - 一个用于后续遍历任何树结构的例子。 – 2010-01-19 18:18:12
不,你需要首先释放孩子的记忆。
这取决于免费后结构会发生什么。只要free()
之后没有引用结构就一切正常。如果释放被调用,然后某些代码引用释放的内存,则可能会发生非常难以调试的事情。不要做后者。
由于所有分配的内存在程序终止时被释放,因此可能不需要释放内存。如果你想节省内存使用,你只需要调用free()。
如果在循环内部创建并删除父结构会怎么样? – egrunin 2010-01-20 02:14:27
我认为值得一提的是,对于短期运行的命令行工具来说,这通常没有关系。一旦你的程序运行完毕,操作系统将收回所有的内存。但是,如果这是一个运行时间不确定的工具,则您需要担心内存管理,其他答案有很好的建议。
我认为说'让操作系统照顾它'是个不好的建议,即使它是针对一个小程序的。你不想养成编写漏码的习惯。 – Trent 2010-01-19 17:24:07
总是首先释放子结构。编写可释放每种类型结构的函数可能是明智的选择,以简化寿命。如果structTypeA包含structTypeB和StructTypeC,这将允许您简单地调用freeStructTypeA(指向sTA实例的指针)并让该函数在释放structTypeA本身之前释放所有子结构。
在相关说明中,您最好尝试通过valgrind运行代码,以确保您正确释放所有内存。
我完全同意。如果一个结构包含动态分配的子对象,通常最容易编写一个函数来处理释放该结构和所有关联的子对象。 – bta 2010-01-20 01:32:36
有点相关:http://stackoverflow.com/questions/1941323/always-check-malloced-memory – jldupont 2010-01-19 17:15:06
你还使用calloc/malloc的子结构? – quinmars 2010-01-19 18:17:46
如果您在子结构上使用calloc(),则必须在该内存上使用free()。否则,当你的程序运行时,它会逐渐占用越来越多的内存。 (如果你的程序在退出之前并没有做太多的事情,但是如果你在循环中这样做,你甚至可能会崩溃。) – egrunin 2010-01-20 02:13:33