假设我有以下代码:
typedef struct {
int numBars;
BarType *bars;
} fooType;
foo = (fooType *) malloc(sizeof(fooType));
foo->bars = (BarType *) malloc(sizeof(barType));
调用free(foo)也会释放酒吧吗?还是我需要这样做:
free(foo->bars);
free(foo);
直觉上,我觉得调用free(foo)就足够了——如果我不需要调用free的话(foo->numBars),我就不需要调用免费的(foo->bars)。但我不必手动为numBars分配内存,而我为bar分配内存。
对于每个malloc
,您需要一个free
。没有什么是"自动"为你做的。
请注意,与您的声明相反,您确实不实际上必须为bars
分配任何内存,就像您不必为numBars
分配内存一样。但是,正在为*bars
分配内存。
一颗恒星可以在C中产生巨大的差异。
通过使用这个:foo=(fooType*)malloc(sizeof(fooType));实际上,您正在为结构体"fooType"分配内存,该结构体只有一个指针来保存另一个已分配内存块的地址)(barType为malloced)。
您必须明确地释放每个有mallocated的内存。否则,如果只使用free(foo)。它会导致内存泄漏(http://en.wikipedia.org/wiki/Memory_leak)!!
free()
非常简单:它释放传递给它的内存块—其一定来自CCD_ 7。它不进行任何级联释放或其他清理。它也不会将指针设为NULL以帮助捕获简单的逻辑错误。
free(foo->bars);
free(foo);
foo = NULL; /* good idea to do this, unless `foo` is going out of scope soon */