在析构函数中多次删除
Multiple delete in destructor
如果我有两个动态数组作为私有数据成员:
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(无操作)。它完全有效,可以接受,并且通常是首选。
删除一个可能为NULL的指针是完全可以的。正如其他人已经指出的那样,在 NULL 指针上调用 delete 会导致 NOP。
但是,删除任何指针后,无论在哪里、为什么、如何、何时,都应该立即将指针赋值给NULL。如果不这样做,可能会导致意外双删除指针,这对您的程序来说是灾难性的坏事 (https://isocpp.org/wiki/faq/freestore-mgmt#double-delete-disaster)。
出于同样的原因,你不会初始化一个指向某个随机地址的指针,你不想在删除它之后让你的指针悬在风中,等待成为你脚下的子弹。
如果我有两个动态数组作为私有数据成员:
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(无操作)。它完全有效,可以接受,并且通常是首选。
删除一个可能为NULL的指针是完全可以的。正如其他人已经指出的那样,在 NULL 指针上调用 delete 会导致 NOP。
但是,删除任何指针后,无论在哪里、为什么、如何、何时,都应该立即将指针赋值给NULL。如果不这样做,可能会导致意外双删除指针,这对您的程序来说是灾难性的坏事 (https://isocpp.org/wiki/faq/freestore-mgmt#double-delete-disaster)。
出于同样的原因,你不会初始化一个指向某个随机地址的指针,你不想在删除它之后让你的指针悬在风中,等待成为你脚下的子弹。