析构函数中的多次删除

Multiple delete in destructor

本文关键字:删除 析构函数      更新时间:2023-10-16

如果我有两个动态数组作为私有数据成员:

std::string* first_array;
std::string* second_array;
我知道我可以简单地在析构函数 中这样删除
myClass::~myClass()
{
   delete[] first_array;
   delete[] second_array;
}

我所关心的是,不是所有的时候我都有数据在两个数组中,所以这是最好的做法吗?

myClass::~myClass()
{
   if(first_array)
       delete[] first_array;
   if(second_array)
       delete[] second_array;
}

我两种都试过了,都可以,不知道哪一种性能更好。

c++标准指定在空指针值上调用delete将导致NOP (No-Operation)。这是完全有效的,可接受的,并且通常是首选的。

删除一个可能为NULL的指针是完全可以的。如前所述,在NULL指针上调用delete会导致NOP。

然而,在删除任何指针之后,无论在哪里,为什么,如何或何时,都应该立即将指针赋值为NULL。如果不这样做,可能会导致指针的意外双删除,这对您的程序来说是灾难性的坏(https://isocpp.org/wiki/faq/freestore-mgmt#double-delete-disaster)。

与不初始化指向某个随机地址的指针的原因相同,您不希望在删除指针后将其悬空,只是等待成为您脚上的子弹。