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