3

次のように、可変サイズのC構造体を使用しています。

typedef struct {  
  int num_elems;  
  int elem1;  
} mystruct;  
// say I have 5 elements I would like to hold.  
mystruct * ms = malloc(sizeof(mystruct) + (5-1) * sizeof(int));  
ms->num_elems = 5;  
// ... assign 5 elems and use struct  
free(ms);

この最後のfree()は、mallocされたすべてのものを解放しますか、それともsizeof(mystruct)のみを解放しますか?

4

2 に答える 2

4

はい。これにより、を使用して割り当てられたブロック全体が解放されmallocます。

(例のように)を使用して単一のメモリブロックを割り当てる場合、そのブロック全体を解放するには、1回だけmalloc呼び出す必要があります。free

于 2010-07-27T23:41:31.667 に答える
2

この種のことを行うときに注意すべきことの1つは、割り当て解除するメモリを決定するためにfreeによって使用される割り当てレコードが、mallocによって作成され、mallocが返すアドレスに関連付けられることです。

これは、mallocされたブロックの最初のバイトを指す任意のポインタでfreeを呼び出すことができ、メモリの正しいブロックの割り当てを解除することを意味しますが、最初のバイト以外のブロック内の任意のアドレスでfreeを呼び出すと、せいぜいSIGSEVまたはSIGBUSになり、最悪の場合、割り当てテーブルが破損し、奇妙で説明のつかない動作につながります。

したがって、このようにブロック割り当てされたmystructを使用している場合は、それらを単一割り当てのmystructと混合しないように注意してください。そうしないと、メモリリークと破損のどちらかという厄介な選択に直面することになります。

于 2010-07-28T01:45:36.013 に答える