关于 C 结构中内存管理的查询

Query regarding memory management in C structures

假设有一个结构体a,其他结构体作为成员

struct a {
struct b* b;
struct c* c;
};
struct a* a1;

现在我动态分配内存给一个对象 a1 = (struct a*) malloc(sizeof(a));

现在我同样创建一个struct b的新对象 struct b* b1 = (struct b*) malloc(sizeof(b));

现在,在编写代码一段时间后,我在 a1 中为 b1 创建了一个引用

a1.b = b1;
b1 = NULL;

稍后如果我释放a1,分配给b1的内存也会被释放吗? free(a1);

Later if I free a1, will the memory allocated to b1 also get freed

不,不会。规则很简单:

  • 每个malloc恰好一个free(假设我们确实想要释放内存)
  • 传递给 free 的地址必须与之前 malloc 返回的地址完全相同。

这里 malloc 当然也适用于任何其他分配函数,例如 callocrealloc 等。因此在您的示例中,所需的 free 调用是:

free(a1.b);
free(a1);