释放通过 malloc 获得的结构数组
Free-ing an array of structs obtained through malloc
所以我有这个结构:
typedef struct type {
int a;
char* b;
} type;
在 main
程序中,我制作了 2 个这些结构的数组,并使用 malloc()
:
type *v;
type *w;
v=malloc(50*sizeof(type));
w=malloc(50*sizeof(type));
现在,如果我想释放这些结构数组,这样做是否正确:
free(v);
free(w);
?
是的,没错。你只需要传递malloc()
和family返回的指针即可。
调用 free()
时无需提及/提供已分配内存的大小。大小将自动处理(OS)。
FWIW,如果你已经为成员分配了动态内存,比如 w[i].b
s,你需要先 free()
它们,因为一旦你在 w
,在 w[i].b
中分配的所有内存将变得无法访问,因此您的程序将泄漏内存。
如果你没有为数据成员分配内存,这将是正确的
char* b;
个数组元素。
否则你需要先释放这个数据成员指向的内存,然后再释放原来的指针。
例如
for ( size_t i = 0; i < 50; i++ ) free( v[i].b );
free( v );
请注意,如果此数据成员是由字符串文字的地址初始化的,那么您不应释放此内存,因为字符串文字具有静态存储持续时间。
所以我有这个结构:
typedef struct type {
int a;
char* b;
} type;
在 main
程序中,我制作了 2 个这些结构的数组,并使用 malloc()
:
type *v;
type *w;
v=malloc(50*sizeof(type));
w=malloc(50*sizeof(type));
现在,如果我想释放这些结构数组,这样做是否正确:
free(v);
free(w);
?
是的,没错。你只需要传递malloc()
和family返回的指针即可。
调用 free()
时无需提及/提供已分配内存的大小。大小将自动处理(OS)。
FWIW,如果你已经为成员分配了动态内存,比如 w[i].b
s,你需要先 free()
它们,因为一旦你在 w
,在 w[i].b
中分配的所有内存将变得无法访问,因此您的程序将泄漏内存。
如果你没有为数据成员分配内存,这将是正确的
char* b;
个数组元素。
否则你需要先释放这个数据成员指向的内存,然后再释放原来的指针。
例如
for ( size_t i = 0; i < 50; i++ ) free( v[i].b );
free( v );
请注意,如果此数据成员是由字符串文字的地址初始化的,那么您不应释放此内存,因为字符串文字具有静态存储持续时间。