You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

含移动构造函数的类:析构函数需检查指针非空再执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:37:50