[英]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.