我正在学习C中的内存管理。
我有一个指向结构的指针,我malloc
通过
some_struct *mystruct = malloc(sizeof(some_struct));
我稍后在该结构上使用free
。
在这个结构中有三个char *
指针;我也记录了他们的记忆。
在我释放*mystruct
之前,我是否还必须释放他们的记忆?或者*mystruct
的破坏是否也会释放结构中的内存?
答案 0 :(得分:5)
你还必须释放struct中指向char *指针的内存。先做,然后释放你的结构
但是不要释放struct中的char *指针,如果你指向其他地方的char *指针的相同内存(即,如果你已经将你的struct复制到另一个struct实例,那些char *指针需要指向有效的记忆。)
答案 1 :(得分:3)
没有魔法,也没有圣诞老人。你必须自己做这项工作。释放您在之前动态分配的所有内存,您将忘记它。
答案 2 :(得分:0)
这就是为什么你以后想要更改为c ++的原因,那么你可以拥有一个自己做的结构(如果你把正确的代码放到它的析构函数中)。在C中,您必须自己完成工作,也就是说,在删除结构之前,删除结构中的内容。当然,当你对一个结构进行malloc时,你还应该正确地初始化结构内部的成员,因为最小化指针指向0,这样在删除时就没有毛刺...
答案 3 :(得分:0)
就良好的做法而言,你应该释放你分配的所有东西,把它想象成打开一个html标签并关闭它,就好的做法而言,不要以你对类的方式思考结构是一个好主意。用C ++或java。
释放结构只释放指向对象的指针,而不是对象本身,
#include <stdio.h>
typedef struct
{
int a,b,c,d;
char some_string[1050];
} first_type;
typedef struct
{
struct first_type *ap;
} second_type;
int main(void)
{
printf("first type: %d\n", sizeof(first_type));
printf("second type: %d\n", sizeof(second_type));
}
如果你运行这个小例子,你会看到类似这样的东西
第一种类型:1068
第二种类型:8
虽然second_type
有一个指向first_type
的指针,但它的大小远小于first_type
。因此,当你使用malloc和free东西时,你只需要保留和释放数据类型在内存中的许多字节。
希望这有帮助。