2017-04-20 161 views
0

我很困惑,爲什麼不從內存中釋放內存calloc(),當讀取項目YOLO這是寫在C.它不會導致任何內存泄漏?爲什麼不從內存釋放calloc()在這裏(YOLO)

代碼如下,或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

注:有一個拉請求修復的bug:https://github.com/pjreddie/darknet/pull/22 –

回答

2

這是一個內存泄漏;你應該總是釋放* alloc'd內存。

+2

你對於有問題的函數泄漏內存很正確,但要小心一些陳述。當你完成它時,你應該總是釋放\ * alloc'd內存*。在分配發生的函數返回之前,並不總是這樣。 –

1

是的。

每次調用shuffle()時都會導致內存泄漏。

如果大小爲零,返回值取決於特定的庫實現(它可能是也可能不是空指針),在這種情況下,返回的指針不應被解除引用。

推薦:

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