0

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

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 的标题往往会吃掉“++”符号)

4

2 回答 2

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

如果它是 ,则仅删除fooNULL,如果new返回一个对象,则不会删除它。

于 2013-08-18T07:27:16.077 回答
2

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

if(!foo)
{
    delete foo;
}

但是无论如何您都不必执行检查:在空指针中调用 delete 是无操作的并且完全安全。因此,您可以将代码简化为

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

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

Foo foo("bar", 100);
于 2013-08-18T07:43:14.847 回答