在条件调用new时调用delete
Calling delete upon a conditional call to new
假设我有以下类:
foo{
~foo();
private:
char *bar;
};
在某些条件下,bar将创建一个新的char数组,那么处理删除它的正确方法是什么?一个简单的嘘声行吗?还是会被认为是不好的做法?
如果bar
是nullptr,则可以安全地对其调用delete:
bar = nullptr;
delete bar;
所以你不需要测试,只需删除即可。
3.7.4.2/3:
提供给解除分配函数的第一个参数的值可能是空指针值;如果是这样,并且deallocation函数是标准库中提供的函数,则该调用没有任何作用。
delete
使用空指针是安全的。这就是为什么在不使用时应该始终将指针设置为NULL
或nullptr
的原因:
struct foo{
foo() : bar(NULL) {}
// ^ Initialize bar to NULL
~foo() {
delete bar;
}
void some_method() {
bar = new char;
...
delete bar;
bar = NULL; // Immediately set bar back to NULL
}
private:
char *bar;
};
请注意,当您将指针设置为new
返回的指针时,必须将其与delete
匹配,而如果您使用new[]
返回的指针进行设置,则一定要在其上使用delete[]
。
无论如何,如果您可以访问C++11智能指针std::shared_ptr
或std::unique_ptr
,那么它们是您的最佳选择
将bar
初始化为nullptr
/NULL
(c++11/c++(,您可以删除它,而无需在析构函数中进行任何检查。
您的类定义将包含char *bar=nullptr;
。
相关文章:
- 如何知道何时调用删除以及何时调用 delete[] C++?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 析构函数是否会自动调用 delete[] C++?
- 调用delete[]时,某些东西导致堆损坏,但我已正确设置了数组的维度
- 在析构函数中调用"delete"运算符时"compiler is out of heap space"编译器错误
- 为什么 delete[] 不等同于 C++ 中为每个元素调用 delete?
- 有没有办法拥有一个未初始化的类数组,这些类在调用 delete[] 时不会被破坏?
- 为什么当我在同一内存中各有两个指针时,我必须调用"delete"两次?
- 在C 中调用delete []内部破坏者
- C++17标准对在nullptr上调用delete有何规定
- 对不完整类型的空指针调用delete合法吗
- 每当在C++中调用 delete/delete[] 时都会中断调试器
- WT C 如何为分配的对象调用DELETE
- 复制指针,然后调用 delete
- 正在对自动对象调用delete
- 在对象的动态数组上调用 delete [] 不会释放内存?
- 调用delete[]会中断我的C++程序
- 如何使std::shared_ptr不调用delete()
- 如果我对对象调用 delete,矢量中的对象指针是否被删除
- 当调用 delete[] X 命令时,到底发生了什么以及谁负责