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

Tim*_*mmy 1 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));
Run Code Online (Sandbox Code Playgroud)

调用free(foo)也会释放条形码或者我需要这样做:

free(foo->bars);
free(foo);
Run Code Online (Sandbox Code Playgroud)

直观地说,我觉得调用free(富)应该是足够了 - 如果我不需要调用free(foo-> numBars)我不应该需要调用free(foo->条).但是我没有为numBars手动分配内存,而是为了吧.

Ker*_* SB 5

对于每一个malloc你需要的人free.没有什么是"自动"为你完成的.

需要注意的是,违背了你的要求,你就不是真正必须分配任何内存bars,就像你不必为分配内存numBars.但是,您正在为其分配内存*bars.

一颗星可以在C中产生很大的影响......

  • @WeatherVane:不,指针不会超出范围.但指针对象将停止存在.这很糟糕. (2认同)
  • +1 @WeatherVane是否重新分配是无关紧要的.一旦'foo`指向的内存被交给`free`,指针变得不确定.取消引用它会调用*未定义的行为*,无论它是否"有效".如果`foo-> bars`是唯一的指针变量,当释放`foo`时,保存从非释放的`bars`分配返回的地址,没有格式良好的代码可以阻止随后的内存泄漏.如果真的设置为与分配顺序非反向释放,则可以在其他指针变量(本地`void*p = foo-> bars;`中)中保留`foo-> bars`. (2认同)