2017-04-20 163 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