1

別のCの質問:

タイプのポインタメンバーを持つ構造体があるとしましょうchar*

構造体のインスタンスを初期化したいときは、次のように呼び出しますmalloc

MyStruct* ptr = (MyStruct*)malloc(sizeof(MyStruct)

char*次に、メンバーに256バイトのメモリを割り当てます。

ptr->mem = (char*)malloc(sizeof(char)*256);

呼び出したときにポインタメンバーとそれが指すメモリは どうなりますfree(ptr);か?valgrindでプログラムをチェックすると、メモリリークが発生していることがわかりますが、明示的に呼び出すfree(ptr->member);と、メモリリークが発生し、valgrindに「無効な空き」エラーが表示されます。

メンバーが指すメモリを管理する適切な方法は何ですか?

4

3 に答える 3

3

最初に ptr->member を解放し、次に構造体を解放する必要があります

free(ptr->member);
free(ptr);
于 2012-04-09T21:08:36.927 に答える
3

を呼び出すとすぐfree(ptr)に、 のメンバーはptrいずれも有効ではなくなります。彼らとは何もできません。しかし、指摘されたメモリはptr->memまだ解放する必要があります。したがって、free(ptr->mem)最初に、またはそのポインターをどこかにコピーして、解放する有効なポインターを用意する必要があります。

複合構造体の割り当てと解放の一般的なパターンは、次のようなものです (これを行うきれいな関数でそれらをラップすると便利です)。

MyStruct* MakeMyStruct() {
    MyStruct* ptr = malloc(sizeof(MyStruct)); //N.B. don't need cast if it's C
    ptr->mem = malloc(sizeof(char)*256);
    //initialise other members
    return ptr;
}

void DestroyMyStruct(MyStruct *ptr) {
    //Free members first, then the struct
    free(ptr->mem);
    free(ptr);
}

メンバーの一部がそれ自体複雑な構造体である場合、それらは上記の 2 つの関数の および の代わりに および をMakeWhatever使用DestroyWhatevermallocて割り当て/解放されます。free

于 2012-04-09T21:16:01.293 に答える
2

経験則では、free(成功した) への呼び出しごとに1 つ必要ですmalloc(通常、これらは逆の順序で発生します)。

のみfree(ptr)の場合は、メモリ リークが発生しています ( に割り当てられたメモリにアクセスする方法がないためptr->mem)。のみの場合はfree(ptr->mem)、完全に解決していません (メモリ リークほど悪くはありません)。

于 2012-04-09T21:08:24.793 に答える