我们说我有以下代码:
typedef struct {
int numBars;
BarType *bars;
} fooType;
foo = (fooType *) malloc(sizeof(fooType));
foo->bars = (BarType *) malloc(sizeof(barType));
免费调用(foo)也会释放条形码,或者我需要这样做:
free(foo->bars);
free(foo);
直觉上,我认为免费拨打电话(foo)应该足够了 - 如果我不需要免费拨打电话(foo-> numBars),我就不需要免费拨打电话(foo->条)。但是我没有为numBars手动分配内存,而我为吧。
答案 0 :(得分:5)
对于每个malloc
,您需要一个free
。没有什么是“自动”为你完成的。
请注意,与您的声明相反,您 not 实际上必须为bars
分配任何内存,就像您不必为numBars
分配内存一样。但是, 为*bars
分配内存。
单个明星可以在C ......中发挥重大作用。
答案 1 :(得分:0)
使用这个:foo =(fooType *)malloc(sizeof(fooType));实际上,您正在为struct'fooType'分配内存,该结构只有指向另一个已分配内存块的地址的指针(malloced for barType)。
您必须明确释放每个malloced内存。否则,如果你只使用免费(foo)。它会导致内存泄漏(http://en.wikipedia.org/wiki/Memory_leak)!!
答案 2 :(得分:-1)
free()
非常简单:它释放传递给它的内存块 - 它必须来自malloc()
。它不会执行任何级联释放或其他清理。它也没有NULL指针来帮助捕获简单的逻辑错误。
free(foo->bars);
free(foo);
foo = NULL; /* good idea to do this, unless `foo` is going out of scope soon */