簡體   English   中英

由malloc和自由行為混淆

[英]Confused by malloc and free behaviour

我對使用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;
}
me->name = "Fotis";

/* ... */

free(me->name);

規則是:

1 malloc = 1 free

你沒有在me->name上使用malloc ,所以你不必free它。

BTW, me->name應該是const char *類型。

當你這樣做

    me->name = "Fotis";

name指針不是由malloc分配的,它指向一個堆棧變量,它在編譯時存儲在二進制文件的strings表中,因此你無法釋放它。

經驗法則是:只釋放你所擁有的malloced。

但是,您無法更新此只讀字符串。

如果你做了類似的事情:

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

由於strdup執行malloc(請參閱手冊),您必須釋放它,並且可以在創建后更新字符串。

是的,如果你分配它們,你必須釋放結構內部指針的所有內存。

在釋放結構之前,還要確保釋放成員。

一種簡單的記憶方式是按照您分配的相反順序釋放它們。

問題是你實際上沒有在你的結構中malloc化char *名稱。

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

當你寫這個

me->name = "Fotis";

你實際上不是malloc,指針名稱指向const char *類型的堆棧變量,它不是malloc'ed。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM