我free()对C中数据结构的使用感到困惑.
如果我有以下数据结构:
struct Person {
char *name;
int age;
float weight;
float height;
};
Run Code Online (Sandbox Code Playgroud)
我通过malloc()同样的方式为结构分配内存:struct Person *me = malloc(sizeof(struct Person));
在完成使用我的结构之后(在结束程序之前),我继续释放分配的内存,如下所示:
free(person_pointer->name);
free(person_pointer);
Run Code Online (Sandbox Code Playgroud)
释放name指针指向的内存对我来说是必要的,因为如果我只是释放person_pointer 我只释放分配用于存储数据结构及其成员 的内存,而不释放指针所指向的内存 - 结构成员.
但是我的实现valgrind似乎暗示第一个free()是无效的.
所以我的问题归结为:当我通过指针释放结构所占用的内存时,我是否应该抢先释放成员指针所指向的内存?
编辑:这是我的整个代码:
#include <stdio.h>
#include <stdlib.h>
struct Person {
char *name;
int age;
float weight;
float height;
};
int main(int argc, char **argv)
{
struct Person *me = malloc(sizeof(struct Person));
me->name = "Fotis";
me->age = 20;
me->height = 1.75;
me->weight = 75;
printf("My name is %s and I am %d years old.\n", me->name, me->age);
printf("I am %f meters tall and I weight %f kgs\n", me->height, me->weight);
free(me->name);
free(me);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
me->name = "Fotis";
/* ... */
free(me->name);
Run Code Online (Sandbox Code Playgroud)
规则是:
1 malloc = 1 free
Run Code Online (Sandbox Code Playgroud)
你没有使用malloc过me->name,所以你不必使用free它.
BTW,me->name应该是const char *类型.