考虑以下C++代码:
class A {
A() {
if(some condition)
exit(1);
}
};
这样做是否合法?也就是在构造函数完成之前直接退出。这样做会有什么副作用吗?
考虑以下C++代码:
class A {
A() {
if(some condition)
exit(1);
}
};
这样做是否合法?也就是在构造函数完成之前直接退出。这样做会有什么副作用吗?
是的,这是合法的C ++。但请注意,这不会像调用throw;
一样解开堆栈,因此任何堆栈分配的变量的析构函数都不会被调用。但它将调用static
变量的析构函数。有关更多信息,请参阅std::exit()
文档。
这样做合法吗?
从技术上讲,是的。但我想不出一个合理的用例。
这样会有什么副作用吗?
exit
会终止进程(静态对象被销毁;自动对象则不会)。在构造函数中调用它并不会改变这一点。
有不同的观点:
从编译器的角度来看,代码是否正确?
是的。在 C++ 程序中,exit
函数可以在任何时候被调用,并尽快导致程序退出。
是否存在可能的意外副作用?
是的。正在构建对象的任何成员或基类的析构函数将不会被调用。例如,如果其中一些负责在磁盘上写入数据以供下次启动使用,则可能不会写入该数据。
是否存在任何情况下它是合法的代码?
没有。如果您需要在对象构造函数内部中止,应抛出异常。如果未捕获异常,它确实会中止程序,但以清洁的方式,确保任何已构造的对象(甚至是构造中的对象的成员)都将调用其析构函数。并且任何调用者都有机会进行一些清理。
长话短说:永远不要这样做!