程序退出码为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
相关产品推荐
相关产品推荐

