在malloc和free上的一天

最近在进行项目开发的时候犯了一个比较低级的错误。代码的大概结构如下

void func() {  
// 其中num1, num2以及num都是常常数  
float *p1 = (float*)malloc(num1);  
float *p2 = (float*)malloc(num2);  
int total;  
if (total < num)  
{  
return 1;  
}    
free(p1); 
p1 = NULL; 
free(p2);  
p2 = NULL; 
}

在使用valgrind进行内存泄漏测试的时候,测了大多数数据都没有内存泄漏,以为代码就没有问题了。然后昨天无意中测了一条数据,发现出现了内存泄漏,并且泄漏的大小等于分配的两个数组大小,即num1 * sizeof(float) + num2*sizeof(float),且内存泄漏的地方定位在两个malloc函数。当时想的是

  • 为啥对大部分数据进行测试都没有出现问题,偏偏这一条出现的内存泄漏呢?
  • 为啥整条数据跑下来,只泄漏了num1 * sizeof(float)+num2*sizeof(float)?
  • 为啥malloc后面跟上了对应的free,还会出现内存泄漏呢?

后来审阅代码的时候,发现问题出现在了if判断。因为对于大部分数据,这个if条件是不成立的,因此内存就像测的时候那样没有泄漏。但是当进入if语句时,此时直接就返回了,并没有释放掉内存,导致出现了泄漏。正确的代码如下:

void func() {  
// 其中num1, num2以及num都是常常数  
float *p1 = (float*)malloc(num1);  
float *p2 = (float*)malloc(num2);  
int total;  
if (total < num)  
{  
    free(p1);  
    p1 = NULL;  
    free(p2);  
    p2 = NULL; 
    return 1;  
}    
free(p1);  
p1 = NULL;  
free(p2); 
p2 = NULL; 
}

编程之路,路漫漫其修远兮,吾将上下而求索。
微信公众号:音频探险记

本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!