0

このように定義された構造体があるとします。

struct myStruct{
    data* anotherStruct;
}

type の構造体のヒープにメモリを割り当てるとしますmyStruct。この構造体へのポインタは と呼ばれptrます。私はそれから電話しますfree(ptr)。これは myStruct だけに割り当てられたメモリを解放しますか、それともmyStructandに割り当てられたメモリを解放しanotherStructますか?

に割り当てられたメモリのみを解放すると、へのポインタがなく、決して解放できないmyStructため、メモリリークが発生しますか?anotherStruct

4

7 に答える 7

3

そのアドレスに割り当てられたメモリのみを解放します。ie: はい、最高レベルです。

これは myStruct だけに割り当てられたメモリを解放しますか、それともmyStructandに割り当てられたメモリを解放しanotherStructますか?

に割り当てられたメモリのみを解放しますmyStruct

に割り当てられたメモリのみを解放すると、へのポインタがなく、決して解放できないmyStructため、メモリリークが発生しますか?anotherStruct

へのポインタがない場合はanotherStruct、はい、メモリがリークします。通常の戦略は、割り当てた順序とは逆の順序でメモリの割り当てを解除することです。

例: あなたのケースでは、最初に割り当てmyStructてからanotherStruct, したがって、正確に逆の順序で割り当てを解除する必要があります。つまり、anotherStruct最初に 解放してからmyStruct.

于 2012-12-07T04:16:53.827 に答える
1

コード内

struct myStruct *ptr = malloc(sizeof(myStruct));
.
.
.
free(ptr);

anotherStructのメンバに*ptr影響を与えたものは何も表示されていませんptr->anotherStruct。おそらく、有用なメモリ ブロックmallocを指すために使用したいと思うでしょう。メモリリークを避けるためptr->anotherStructに、呼び出すfree(ptr->anotherStruct) 前に呼び出す必要があります。free(ptr)

このような「内部 (解放) 割り当て」を自動的に処理するために、初期化関数と破棄関数を定義すると非常に便利です。

于 2012-12-07T04:25:02.790 に答える
1

最高レベルのみ。それほど賢くはありません。

于 2012-12-07T04:16:37.767 に答える
0

アドレスはメモリを解放するための鍵です。返された各malloc()メモリは個別のキーです。そのため、上位ブロック (つまり、myStruct 型に割り当てられたメモリ) のみが解放され、メモリ リークが発生します。

ベスト プラクティスは、これらの内部ブロックを解放してから、上位のブロックを解放することです。そうしないと、どこにも格納されていない場合、ポインターアドレスが失われます。

于 2012-12-07T04:18:11.410 に答える
0

「free」は、最高レベルで割り当てられたメモリのみを解放できます。単純な理由は、構造体内のポインター メンバーの場合、ヒープからメモリを割り当てる場合と割り当てない場合があるためです。すべてのポインター メンバーのメモリがどこから来たのかをどのように追跡できるのでしょうか?

于 2012-12-07T04:19:22.080 に答える
0

そのアドレスに割り当てられたメモリのみを解放します。連鎖リスト全体を解放したい場合は、それをループして毎回1つの要素(あなたの場合は構造体)を解放する必要があります。アドレスを保存する必要があります次の構造体に実際のポインターを解放してから、次の構造体に移動し、null を指すポインターに到達するまで続けます。

于 2012-12-07T04:20:46.330 に答える
0

はい、誰もが言ったように、anotherStruct が指すものではなく、構造体にのみ割り当てられたメモリを解放します。それは確かにメモリリークを引き起こします。動的に割り当てられたメモリを解放するのはプログラマの責任です。

ツール「valgrind」を使用して、メモリ リークをチェックできます。

于 2012-12-07T06:12:37.347 に答える