2010-01-19 118 views
2

我有一个命令行C程序,我使用calloc()函数为一个结构分配一些内存,该结构也有一个结构体,并且分配了一些内存。使用后释放内存

如果我使用free()函数从父结构中释放内存,它是否也会从子结构释放内存?

或者我应该首先从子结构中释放内存?

+0

有点相关:http://stackoverflow.com/questions/1941323/always-check-malloced-memory – jldupont 2010-01-19 17:15:06

+0

你还使用calloc/malloc的子结构? – quinmars 2010-01-19 18:17:46

+0

如果您在子结构上使用calloc(),则必须在该内存上使用free()。否则,当你的程序运行时,它会逐渐占用越来越多的内存。 (如果你的程序在退出之前并没有做太多的事情,但是如果你在循环中这样做,你甚至可能会崩溃。) – egrunin 2010-01-20 02:13:33

回答

13

它是一个简单的规则,对于你所做的每个内存分配,你必须自己明确释放内存。所以,你需要自己释放孩子的记忆。

+6

在释放父结构之前,你至少需要获取指向子内存的指针 - 确保代码不会访问释放的内存。或者,只需在父母面前释放子结构 - 一个用于后续遍历任何树结构的例子。 – 2010-01-19 18:18:12

6

不,你需要首先释放孩子的记忆。

0

这取决于免费后结构会发生什么。只要free()之后没有引用结构就一切正常。如果释放被调用,然后某些代码引用释放的内存,则可能会发生非常难以调试的事情。不要做后者。

0

由于所有分配的内存在程序终止时被释放,因此可能不需要释放内存。如果你想节省内存使用,你只需要调用free()。

+0

如果在循环内部创建并删除父结构会怎么样? – egrunin 2010-01-20 02:14:27

0

我认为值得一提的是,对于短期运行的命令行工具来说,这通常没有关系。一旦你的程序运行完毕,操作系统将收回所有的内存。但是,如果这是一个运行时间不确定的工具,则您需要担心内存管理,其他答案有很好的建议。

+5

我认为说'让操作系统照顾它'是个不好的建议,即使它是针对一个小程序的。你不想养成编写漏码的习惯。 – Trent 2010-01-19 17:24:07

1

总是首先释放子结构。编写可释放每种类型结构的函数可能是明智的选择,以简化寿命。如果structTypeA包含structTypeB和StructTypeC,这将允许您简单地调用freeStructTypeA(指向sTA实例的指针)并让该函数在释放structTypeA本身之前释放所有子结构。

在相关说明中,您最好尝试通过valgrind运行代码,以确保您正确释放所有内存。

+0

我完全同意。如果一个结构包含动态分配的子对象,通常最容易编写一个函数来处理释放该结构和所有关联的子对象。 – bta 2010-01-20 01:32:36