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

程序退出码为4且析构函数未执行,求原因排查

关于程序退出码4且未调用析构函数的问题分析

首先明确:退出码4一般意味着程序因未定义行为或非法操作被系统强制终止,这种情况下进程会直接结束,自然来不及调用对象的析构函数。咱们一步步拆解你的代码问题:

1. 基类A的赋值运算符存在致命缺陷

看你基类A的operator=实现:

virtual A& operator=(const A& rhs) { cout << "A op=" << endl; }

这里的核心问题是:你声明了返回A&类型,但函数体内没有返回任何值!这属于C++中的未定义行为——编译器可能生成错误的机器码,运行时会引发栈损坏、程序崩溃等不可预测的结果。

当你执行以下代码时,都会触发这个有问题的赋值运算符:

  • myOtherB = myB;:因为B没有自定义赋值运算符,编译器会生成默认版本,它会依次调用基类A的operator=和成员mInstanceOfA的operator=,基类无返回值的操作直接引发未定义行为。
  • myA = foo(myOtherB);:foo函数返回一个A对象(会调用拷贝构造函数),赋值给myA时同样触发这个有缺陷的operator=。

2. 未定义行为导致程序提前崩溃

这种未定义行为会让程序在运行时出现异常,操作系统会直接终止进程,所以你看到退出码4,且所有对象的析构函数都没机会执行——进程已经被强制杀死了。

修复方案

给基类A的赋值运算符补充返回语句,这是赋值运算符的标准要求:

virtual A& operator=(const A& rhs) {
    cout << "A op=" << endl;
    return *this; // 必须返回当前对象的引用,符合赋值运算符的规范
}

另外,建议给B也自定义赋值运算符(虽然默认版本暂时能工作,但后续如果B添加资源管理类成员,会出现浅拷贝问题):

B& operator=(const B& rhs) {
    A::operator=(rhs); // 显式调用基类的赋值运算符
    mInstanceOfA = rhs.mInstanceOfA; // 处理成员变量的赋值
    cout << "B op=" << endl;
    return *this;
}

修复后,程序就能正常执行,析构函数会按预期被调用,退出码也会变为0(正常退出)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:39:28