含移动构造函数的类:析构函数需检查指针非空再执行delete吗?
析构函数中delete[]前是否需要检查指针非空?
其实你完全不用在delete[]之前额外检查指针是否非空,因为C++标准明确规定,对nullptr执行delete[]是完全安全的操作,不会产生任何副作用。
咱们来拆解一下细节:
- 你在移动构造函数里把
rhs.data置为nullptr的做法非常正确,这避免了原对象和新对象同时持有同一块内存的风险。当原对象的析构函数执行时,哪怕直接调用delete[] data;,编译器也会直接忽略这个对空指针的释放操作,不会触发任何错误。 - 带
if (data)的判断写法虽然不会出错,但属于冗余代码——既不会提升性能,也不会增加安全性,反而让代码显得啰嗦。
结合你的代码示例,更简洁且符合C++规范的写法是直接去掉判断:
class A { int *data; public: A(size_t size) : data(new int[size]) {} A(A &&rhs) : data(rhs.data) { rhs.data = nullptr; } ~A() { delete [] data; // 直接写这个就够了,无需检查 } };
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

