如何直接从构造函数结束C ++代码?

时间:2017-10-01 17:40:48

标签: c++ c++11 c++14 exit exit-code

如果满足某个条件,我希望我的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不是一个好主意。

3 个答案:

答案 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
}