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

C++自定义析构函数与默认析构函数的成员释放规则问题

C++类析构函数相关问题解答

先明确C++对象销毁的固定执行规则,只要不触发未定义行为,流程不会随析构函数的写法改变:

  1. 先执行当前类的析构函数体:如果用户没声明自定义析构,就调用编译器生成的默认析构,它的函数体是空的
  2. 按照类中非静态成员声明顺序的逆序,逐个调用每个成员自身的析构函数
  3. 如果该类有基类,最后执行基类的析构流程
  • 问题1:未自行实现析构函数,使用delete销毁对象时,默认析构函数是否会完成全部4个成员的资源释放?
    不一定。默认析构的函数体本身没有任何逻辑,执行完空函数体后会自动触发所有成员的析构流程:

    • 如果成员是普通值类型(如int/char)、或是遵循RAII规范的类型(如std::string/std::vector/智能指针),成员自身的析构函数会正确释放自身持有的资源,不存在泄漏
    • 如果成员是指向堆内存的裸指针,默认析构只会回收指针变量本身占用的内存空间,不会自动调用delete释放指针指向的堆内存,这部分资源会泄漏。
  • 问题2:实现空的自定义析构函数,是否所有成员资源都不会被释放?
    不是。空自定义析构的行为和编译器生成的默认析构几乎完全一致:执行完你写的空函数体后,编译器照样会按规则触发所有成员的析构流程,成员资源的释放逻辑和使用默认析构时完全相同,不存在“写了空析构成员就不释放”的情况。

  • 问题3:自定义析构函数中仅显式释放1个成员,其余3个成员是否仍会被自动释放?
    会自动释放。你在析构函数体内写的显式释放逻辑属于自定义执行逻辑,等整个析构函数体执行完毕后,编译器依然会按照逆序调用所有4个成员的析构函数——也就是说你显式处理过的那个成员也会走完自身的析构流程,剩下3个成员的析构逻辑不会受任何影响。
    这里需要注意一个常见坑:如果你显式释放的是RAII类型成员持有的资源(比如手动delete了std::unique_ptr内部管理的指针),后续编译器调用该RAII成员的析构函数时会触发重复释放,属于未定义行为。如果是对自己管理的裸指针成员手动delete,因为裸指针没有析构函数,后续不会产生额外操作,是安全的。

内容的提问来源于stack exchange,提问作者Roman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 17:45:39