0

必要に応じてメモリを解放することは知っていますreallocし、C の 3 番目のルールも知っています。mallocfree

状況は、コードで最もよく説明されています。

int main()
{
    myStruct **myStructArray;
    int      i, num_elements;

    num_elements = getnumber(); // gets value for num_elements

    myStructArray = (myStruct **) malloc(num_elements * sizeof(myStruct*));
    for (i=0; i<num_elements; i++)
        myStructArray[i] = (myStruct *) malloc(sizeof(myStruct));

    // so far so good...

    num_elements = getnumber(); // gets new, LOWER value

    myStructArray = realloc(myStructArrary, num_elements * sizeof(myStruct*));

    // rest_of_code, and necessary free loop for myStructArray etc...
}

明らかに、上記はスニペットにすぎませんが、スニペットは千の単語を描きます。

これにより、メモリリークが発生しますか? を呼び出すとreallocポインタのメモリが解放されることはわかっていますが、忘れ去られた大量のメモリがまだ存在する可能性については、賛否両論があります。

リークは、コードに組み込み、(現在は NULL の) ポインターを解放するために呼び出しを行う前に余分な sint number_elements_newをループすることで回避できます。freemyStructrealloc

ドンキーが機能し、関連するすべてのメモリを解放する場合realloc、それは素晴らしいことmyStructです。

あなたの推薦をありがとう...

4

3 に答える 3

6

malloc、メモリが何に使用されているかわかりませんreallocfreeメモリを使用して、他の動的に割り当てられたメモリへのポインターを格納している場合は、それを整理する必要があります。


reallocまた、コード スニペットで使用している方法は安全でない可能性があることに注意してください。失敗した場合reallocは、元のメモリを解放せずにそのままにして、 を返しますNULL。ベスト プラクティスは、戻り値を一時ポインターに割り当ててから確認することです。たとえばhttp://www.c-faq.com/malloc/realloc.htmlを参照してください。

于 2013-01-25T14:25:23.513 に答える
0

配列のサイズを縮小する場合は、最初にfreemyStructArray[i] where i>=が必要にnum_elementsなります。そうしないと、メモリ リークが発生します。

別の言い方をすれば、ポインタ配列のサイズを縮小しても、各配列要素が指していたメモリには影響しません。

また、realloc呼び出しでは、結果を一時ポインターに割り当てる必要があります。バッファを拡張または縮小できない場合realloc、NULL が返され、そのブロックへの参照が失われ、リークも発生します。

myStruct **tmp = realloc(myStructArray, ...);
if (tmp)
{
  myStructArray = tmp;
  ...
}
于 2013-01-25T14:33:11.767 に答える
0

この数が既存の要素数よりも少ない場合、再割り当てされたブロックがコンテンツに関係なく、for ループで割り当てられたブロックへの参照が失われるため、メモリ リークが発生します。

したがって、配列をループして、削除されるすべての要素を解放する必要があります。

数値が既存の数値よりも大きい場合、新しいメモリ ブロックが割り当てられている場合、realloc は既存のデータをコピーするため、メモリ リークは発生しません。したがって、他の動的に割り当てられたブロック (for ループの malloc) は、サイズ変更された配列によって引き続き参照されます。ここで唯一の問題は、新しく割り当てられた配列スペースが初期化されていないため、無効なポインターが含まれている可能性があることです。

于 2013-01-25T14:30:18.347 に答える