我正在从一个巨大的外部包中创建一个类。 我跑了:
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的标题不知何故会吃掉“++”的标志)
答案 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);