1. ホーム
  2. c

[解決済み] C - 構造体の解放

2022-02-14 16:11:18

質問

例えば、次のような構造体があるとします。

typedef struct person{
    char firstName[100], surName[51]
} PERSON;

で、mallocで領域を確保し、いくつかの値で埋めています。

PERSON *testPerson = (PERSON*) malloc(sizeof(PERSON));
strcpy(testPerson->firstName, "Jack");
strcpy(testPerson->surName, "Daniels");

その構造体によって占有されているすべてのメモリを解放するための、正しく安全な方法は何ですか?それとも、各構造体の属性を 1 つずつ解放する必要がありますか?

構造体はどのようにメモリに格納されるのでしょうか?構造体のアドレスを表示しようとすると、その最初の属性のアドレスと同じになってしまうという、奇妙な挙動に気づきました。

printf("Structure address %d == firstName address %d", testPerson, testPerson->firstName);

ということは、この free(testPerson) はこれと同じであるべきです free(testPerson->firstName)となります。

で、それは私がやりたいことではありません。

ありがとうございます

解決方法は?

簡単な答え free(testPerson) で十分です。

を使用できることを忘れないでください。 free() を使用してメモリを確保したときのみ malloc , calloc または realloc .

この場合、メモリは testPerson ので、それを解放すれば十分です。

を使用した場合 char * firstname , *last surName その場合、名前を格納するためにメモリを確保しなければならず、そのために各メンバーを個別に解放しなければなりませんでした。

つまり、要素に割り当てたメモリは後で使うということです。 free() まず、オブジェクトへのポインタを解放します。

各要素を解放すると、以下のようなデモを見ることができます。

typedef struct Person
{
char * firstname , *last surName;
}Person;
Person *ptrobj =malloc(sizeof(Person)); // memory allocation for struct
ptrobj->firstname = malloc(n); // memory allocation for firstname
ptrobj->surName = malloc(m); // memory allocation for surName

.
. // do whatever you want

free(ptrobj->surName);
free(ptrobj->firstname);
free(ptrobj);

この背景には、もしあなたが ptrobj で確保されたメモリがリークします。 firstnamesuName のポインタを使用します。