5

我对free()C 中关于数据结构的用法感到困惑。

如果我有以下数据结构:

struct Person {
    char *name;
    int age;
    float weight;
    float height;
};

我通过 为结构分配内存malloc(),同样:struct Person *me = malloc(sizeof(struct Person));

在我完成使用我的结构之后(就在结束程序之前),我继续释放分配的内存,如下所示:

free(person_pointer->name);
free(person_pointer);

据我所知,释放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;
}
4

4 回答 4

5
me->name = "Fotis";

/* ... */

free(me->name);

规则是:

1 malloc = 1 free

你没有使用mallocon me->name,所以你不必使用free它。

顺便说一句,me->name应该是const char *类型。

于 2013-03-03T12:09:19.040 回答
1

当你这样做

    me->name = "Fotis";

name指针不是由 malloc 分配的,它指向一个堆栈变量,该变量在编译时存储在二进制文件的字符串表中,因此您无法释放它。

经验法则是:只释放你分配的东西。

但是,您无法更新此只读字符串。

如果你做了类似的事情:

me->name = strdup("Fotis");

由于 strdup 执行 malloc(参见手册),因此您必须释放它,并且可以在创建字符串后更新它。

于 2013-03-03T12:09:35.257 回答
1

Yes you have to free all the memory of pointers inside the structure if you allocated them.

Also make sure you free the members before you free the structure.

A simple way to remember is free them in the reverse order in which you have allocated.

于 2013-03-03T12:10:22.813 回答
1

The problem is that you didn't actually malloc'ed the char * name inside your structure.

struct Person *me = malloc(sizeof(struct Person));
me->name = strdup("Fotis");
...
free(me->name);
free(me);
return (0);

When you write this

me->name = "Fotis";

You don't actually malloc, the pointer name points to a stack variable of type const char *, wich is not malloc'ed.

于 2013-03-03T12:14:24.653 回答