C ++:只是构造函数的内存泄漏

时间:2013-08-18 07:26:01

标签: c++ memory-leaks

我正在从一个巨大的外部包中创建一个类。 我跑了:

Foo* foo = new Foo("bar", 100);
if(!foo)
{
    delete foo;
}

Foo::Foo(TString bar, int num)
{
    setnull();
}

并且setnull()只是将每个类指针设置为NULL,如:

void Foo::setnull()
{
    fooArray = NULL
    ...
}

和析构函数

Foo::~Foo()
{
    if(fooArray != NULL)
            delete[] fooArray;
    ...
    setnull();
}

在.hh文件中,实际上有很多指针从外部包设置到NULL。结果我得到了:

definitely lost: 332 bytes in 1 blocks

我也因添加构造函数而间接丢失:

fooArray = new (nothrow) bool [5];
    if (fooArray == NULL)
    {
        cout << "ERROR: memory could not be allocated"<<endl;
    }
fooArray[0] = 0;    

indirectly lost: 26 bytes in 2 blocks

(另一件事,Stackoverflow的标题不知何故会吃掉“++”的标志)

2 个答案:

答案 0 :(得分:4)

Foo* foo = new Foo("bar", 100);
if(!foo)
{
    delete foo;
}

您只是删除foo NULL,如果new返回某个对象,则不会将其删除。

答案 1 :(得分:2)

正如在其他答案中指出的那样,这种逻辑是错误的:

if(!foo)
{
    delete foo;
}

但是你无论如何都不必执行检查:在空指针中调用delete是一种无操作且完全安全的操作。所以你可以简化你的代码

Foo* foo = new Foo("bar", 100);
delete foo;

当然,更简单,更安全的选择是

Foo foo("bar", 100);