-1

我在 Solaris 中运行的代码上运行了 purify,它显示了很多内存泄漏。但是我检查了代码,大多数泄漏似乎都是无效的。

例如,

文件1.cpp

Obj* getMyObj()
{
    Obj* obj = NULL;
    if(condition)
    {
        obj = new Obj();   //Purify is reporting leak here
        //Fill obj
    }

    ...
    return obj;
}

文件2.cpp

void myfunc()
{
    Obj* myobj = getMyObj();

   if(myobj == NULL)
       return;
    ...
    ...

    delete myobj;    //The object is deleted here
}

即使对象被正确销毁File2.cpp,为什么净化报告泄漏File1.cpp

编辑

NULL 检查只是一个错字,我更正了。

4

3 回答 3

2

即使对象在 File2.cpp 中被正确销毁,[...]

这个假设是错误的。

Obj* myobj = getMyObj();

如果getMyObj实际创建了一个对象,它不会返回一个空指针。这意味着下面的条件if为真,然后函数立即返回。

if(myobj)
    return;

该函数中不再执行任何代码,因此它永远不会被破坏。

我建议使用智能指针而不是这种手动管理,因为这种错误会消失。使用 C++11 你可以使用std::unique_ptr,否则std::auto_ptr如果你小心的话你可以使用。

于 2012-07-31T04:38:23.730 回答
0
if(myobj)
   return;

对象创建后返回继续,删除从未执行

您需要修改代码:

-if(myobj)
+if(myobj==NULL)
于 2012-07-31T04:37:54.693 回答
0

file1.cpp

Obj* getMyObj();

该函数有点不安全,因为函数的调用者需要知道他必须删除返回的对象,但从函数中不清楚这是必要的

更好的是使用像 shared_ptr 这样的智能指针而不是原始指针,这样就很清楚返回的对象是在堆上分配的,以及它是如何被销毁的(如果已分配)。

std::shared_ptr<Obj> getMyObj();
于 2012-07-31T04:56:16.293 回答