C++:仅用于构造函数的内存泄漏

C++ : memory leak for just constructor

本文关键字:内存 泄漏 构造函数 用于 C++      更新时间:2023-10-16

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

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

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

如果是NULL,则只删除foo,如果new返回一个对象,则不会删除它。

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

if(!foo)
{
    delete foo;
}

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

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

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

Foo foo("bar", 100);