c-在动态分配的内存中,free()的作用域是什么



假设我有以下代码:

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

相关内容

  • 没有找到相关文章

最新更新