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
だけでは、データ構造とそのメンバーを格納するために割り当てられたメモリのみを解放し、 構造のポインターメンバーが指すメモリは解放しないためです。 .
ただし、私の実装では、valgrindfree()
は最初のものが無効であることを示唆しているようです。
したがって、私の質問は次のようになります:構造体が占有するメモリをポインターを介して解放するとき、メンバー ポインターが指すメモリを事前に解放する必要がありますか?
編集:これは私のコード全体です:
#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;
}