今天调查内存泄漏,发现一块申请的堆未释放,于是加了一段释放代码
if(!pbuffer)
{
TaskMemFree(pbuffer);
}
运行程序,发现仍然泄漏,继续检查其余代码,没发现问题,正在郁闷中,发现单步调试不能走到
释放代码内部,一看条件判断,晕!写了个无效代码,pbuffer为空时才会执行释放操作,改为
if(pbuffer)
{
TaskMemFree(pbuffer);
}
问题解决!
看来写代码时显示判断还是保险些啊,如果当初写成
if(pbuffer != NULL)
{
TaskMemFree(pbuffer);
}
就不会出现这样的问题了。
另外发现,堆分配时要做好配对,TaskMemAlloc要与TaskMemFree一起用,
New和Delete一起用,尤其在调用方法负责分配空间,调用者负责释放时,要
做好约定,有次用TaskMemAlloc分配的空间,但用Delete释放掉了,造成内
存泄漏,奇怪的是当时用Release版本,编译器不能检查出来,但用Debug版
本就提示出错了。