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 だけでは、データ構造とそのメンバーを格納するために割り当てられたメモリのみを解放し、 構造のポインターメンバーが指すメモリは解放しないためです。 .

ただし、私の実装では、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;
}
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 によって割り当てられません。コンパイル時にバイナリ ファイルの文字列テーブルに格納されているスタック変数を指しているため、解放できません。

経験則は次のとおりです。mallocしたものだけを解放します。

ただし、この読み取り専用文字列を更新することはできません。

次のようなことをした場合:

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

strdup は malloc を実行するため (マニュアルを参照)、それを解放する必要があり、作成後に文字列を更新できます。

于 2013-03-03T12:09:35.257 に答える
1

はい、それらを割り当てた場合、構造内のポインターのすべてのメモリを解放する必要があります。

また、構造体を解放する前にメンバーを解放してください。

覚える簡単な方法は、割り当てたのと逆の順序で解放することです。

于 2013-03-03T12:10:22.813 に答える
1

問題は、構造内の char * 名を実際に malloc していないことです。

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

これを書くと

me->name = "Fotis";

実際には malloc しません。ポインター名は、malloc されていない type のスタック変数をconst char *指します。

于 2013-03-03T12:14:24.653 に答える