2017-04-20 8 views
0

calloc()からメモリを解放してください。なぜなら、Cで書かれたYOLOというプロジェクトを読んでいると、混乱します。ここでcalloc()からメモリを解放しないでください。

コードは次のとおりです。check hereです。

void shuffle(void *arr, size_t n, size_t size) 
{ 
    size_t i; 
    void *swp = calloc(1, size); // not free 
    for(i = 0; i < n-1; ++i){ 
     size_t j = i + rand()/(RAND_MAX/(n-i)+1); 
     memcpy(swp,   arr+(j*size), size); 
     memcpy(arr+(j*size), arr+(i*size), size); 
     memcpy(arr+(i*size), swp,   size); 
    } 
} 

誰かが私に答えを与えることができますか?

+1

注:そのバグを修正するためにプル要求があります:https://github.com/pjreddie/darknet/pull/22 –

答えて

2

これはメモリリークです。あなたは常に* alloc'dメモリを解放するべきです。

+2

あなたは問題の関数がメモリをリークするが、ブランケットステートメントには注意が必要です。 \ * alloc'dメモリ*は、いつでも解放する必要があります。これは、割り当てが行われる関数から戻る前に必ずしもそうとは限りません。 –

1

はい。

shuffle()が呼び出されるたびにメモリリークが発生します。

sizeが0の場合、戻り値は特定のライブラリ実装に依存します(nullポインタであってもNULLポインタでなくてもかまいません)。その場合、返されるポインタは参照解除されません。

推奨:

void shuffle(void *arr, size_t n, size_t size) 
{ 
    if (size == 0)return; 
    size_t i; 
    void *swp = calloc(1, size); // not free 
    for (i = 0; i < n - 1; ++i){ 
     size_t j = i + rand()/(RAND_MAX/(n - i) + 1); 
     memcpy(swp, arr + (j*size), size); 
     memcpy(arr + (j*size), arr + (i*size), size); 
     memcpy(arr + (i*size), swp, size); 
    } 
} 

enter image description here

enter image description here

+1

ありがとうございますが、あなたが推奨するコードは 'swp'を解放していませんか? – foo

関連する問題