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

C++析构函数delete指针导致VSCode运行后程序不自动终止问题排查

错误原因总览

你遇到的程序无法正常退出、析构行被高亮的核心原因是内存操作存在多处未定义行为,具体错误点如下:

  • 1. 对栈内存指针执行delete操作(核心错误)
    C类析构函数中delete var_a的操作要求var_a必须指向new分配的堆内存,但你在main函数中传给C构造的是栈上对象ca、cb的地址,栈内存不需要也绝对不能用delete释放,这属于严重的内存访问错误,直接导致程序运行异常、退出卡顿甚至崩溃。
    你看到的调试控制台输出是gdb调试工具的常规提示,和代码逻辑错误无关,程序异常完全是该内存操作错误触发的。
  • 2. 手动调用栈对象的析构函数,造成重复析构
    你在main末尾主动调用了cc.~C(),而cc是栈上分配的C类对象,当main函数执行结束、栈帧回收时,系统会自动再次调用cc的析构函数,等于同一个对象的析构函数被执行了两次,第二次delete var_a时操作的是已经被释放的野指针,进一步加剧了内存错误。
  • 3. 基类A缺少虚析构函数
    你用基类A指针指向派生类B的实例(比如cc2(&cb)),当delete基类指针时,如果基类没有虚析构函数,只会调用基类A的析构,不会调用派生类B的析构,属于C++多态场景下的典型规范错误,即使当前B类没有额外申请堆资源不会触发明显问题,也存在严重隐患。
  • 4. 主函数错误包含cpp实现文件
    正常C++项目只需要在编译单元中包含头文件,cpp文件是单独编译后链接的,你在主函数中写#include "test4.cpp"会导致符号重复定义的风险,属于不规范的写法。

修复方案

  1. 如果要保留C类中delete成员指针的逻辑,传入C构造的A指针必须是new出来的堆对象,比如把C cc(&ca);改成C cc(new A());,C cc2(&cb);改成C cc2(new B());
  2. 删除main中手动调用析构的代码cc.~C();,交由系统自动处理栈对象的生命周期
  3. 给A类添加虚析构函数:在A类的public区域添加virtual ~A() = default;
  4. 移除主函数中#include "test4.cpp"的语句,编译时同时链接test4.cpp和主函数文件即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 02:36:04