在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 协议》,转载必须注明作者和本文链接
推荐文章: