动态分配内存中free()的范围是什么?

时间:2014-10-27 19:35:55

标签: c malloc free dynamic-memory-allocation dynamic-allocation

我们说我有以下代码:

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手动分配内存,而我为吧。

3 个答案:

答案 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 */