假设我有以下课程:
foo{
~foo();
private:
char *bar;
};
在某些条件下,bar会创建一个新的char数组,那么处理删除它的正确方法是什么?一个简单的布尔会做或者会被认为是不好的做法吗?
答案 0 :(得分:7)
如果bar
为nullptr,那么您可以安全地在其上调用delete:
bar = nullptr;
delete bar;
所以你不需要测试,只需要删除。
3.7.4.2/3:
提供给释放函数的第一个参数的值可以是空指针值;如果是这样,并且如果解除分配功能是标准库中提供的功能,则该呼叫无效。
答案 1 :(得分:4)
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
,那么它们是您最好的选择。
答案 2 :(得分:1)