我在Solaris上运行的代码上运行了purify,它显示了很多内存泄漏。 但我检查了代码,大部分泄漏似乎无效。
例如,
File1.cpp
Obj* getMyObj()
{
Obj* obj = NULL;
if(condition)
{
obj = new Obj(); //Purify is reporting leak here
//Fill obj
}
...
return obj;
}
File2.cpp
void myfunc()
{
Obj* myobj = getMyObj();
if(myobj == NULL)
return;
...
...
delete myobj; //The object is deleted here
}
即使对象在File2.cpp
中被正确销毁,为什么在File1.cpp
中清除报告泄漏?
修改
NULL检查只是一个错字,我纠正了它。
答案 0 :(得分:2)
即使在File2.cpp中正确销毁了对象,[...]
这个假设是错误的。
Obj* myobj = getMyObj();
如果getMyObj
实际创建了一个对象,它将不会返回空指针。这意味着以下if
中的条件为真,然后函数立即返回。
if(myobj)
return;
在该函数中不再执行任何代码,因此它永远不会被破坏。
我建议使用智能指针而不是这种手动管理,因为这种错误就消失了。使用C ++ 11,您可以使用std::unique_ptr
,否则如果您小心,可以使用std::auto_ptr
。
答案 1 :(得分:0)
if(myobj)
return;
创建对象后,返回继续,删除从未执行
您需要修改代码:
-if(myobj)
+if(myobj==NULL)
答案 2 :(得分:0)
在file1.cpp
Obj* getMyObj();
该函数有点不安全,因为函数的调用者需要知道他必须删除返回的对象但是函数中不清楚它是否有必要
更好的是使用像shared_ptr这样的智能指针而不是原始指针,然后很清楚返回的对象是在堆上分配的,以及它是如何被销毁的(如果已分配)。
std::shared_ptr<Obj> getMyObj();