关于 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
当然也适用于任何其他分配函数,例如 calloc
、realloc
等。因此在您的示例中,所需的 free
调用是:
free(a1.b);
free(a1);
假设有一个结构体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
当然也适用于任何其他分配函数,例如 calloc
、realloc
等。因此在您的示例中,所需的 free
调用是:
free(a1.b);
free(a1);