如果满足某个条件,我希望我的C ++代码停止运行并进行适当的对象清理;在类的构造函数中。
class A {
public:
int somevar;
void fun() {
// something
}
};
class B {
public:
B() {
int possibility;
// some work
if (possibility == 1) {
// I want to end the program here
kill code;
}
}
};
int main() {
A a;
B b;
return 0;
}
如何在此时终止我的代码进行适当的清理。众所周知,std::exit
不执行任何类型的堆栈展开,堆栈上没有活动对象会调用其各自的析构函数来执行清理。所以std::exit
不是一个好主意。
答案 0 :(得分:7)
当构造函数失败时,您应抛出异常。
B() {
if(somethingBadHappened)
{
throw myException();
}
}
确保捕获main()
和所有线程入口函数中的异常。
在Throwing exceptions from constructors中阅读更多内容。阅读How can I handle a destructor that fails中的堆栈展开。
答案 1 :(得分:3)
不能仅仅从构造函数执行。如果你抛出一个异常,那么应用程序需要在入口点设置一个正确的异常处理代码,因为如果你抛出一个不会被处理的异常,那么允许编译器跳过堆栈展开和清理。
答案 2 :(得分:-1)
如果您不想使用use exception,则可以在类B
中使用返回返回码的init方法:
class B {
public:
B(/*parameters that will be used by init*/) : ...
int init(); // actually initialize instance and return non 0 upon failure
}