在C++中,我们可以从构造函数中调用exit()吗?

3

考虑以下C++代码:

class A {
  A() {
    if(some condition)
      exit(1);
  }
};

这样做是否合法?也就是在构造函数完成之前直接退出。这样做会有什么副作用吗?


是的,这是合法的,但你真的想那样立即关闭整个应用程序吗?请参考此链接 - PaulMcKenzie
3个回答

2

是的,这是合法的C ++。但请注意,这不会像调用throw;一样解开堆栈,因此任何堆栈分配的变量的析构函数都不会被调用。但它将调用static变量的析构函数。有关更多信息,请参阅std::exit()文档。


1

这样做合法吗?

从技术上讲,是的。但我想不出一个合理的用例。

这样会有什么副作用吗?

exit会终止进程(静态对象被销毁;自动对象则不会)。在构造函数中调用它并不会改变这一点。


0

有不同的观点:

  • 从编译器的角度来看,代码是否正确?

    是的。在 C++ 程序中,exit 函数可以在任何时候被调用,并尽快导致程序退出。

  • 是否存在可能的意外副作用?

    是的。正在构建对象的任何成员或基类的析构函数将不会被调用。例如,如果其中一些负责在磁盘上写入数据以供下次启动使用,则可能不会写入该数据。

  • 是否存在任何情况下它是合法的代码?

    没有。如果您需要在对象构造函数内部中止,应抛出异常。如果未捕获异常,它确实会中止程序,但以清洁的方式,确保任何已构造的对象(甚至是构造中的对象的成员)都将调用其析构函数。并且任何调用者都有机会进行一些清理。

长话短说:永远不要这样做!


throw 不保证对象的销毁如果没有找到匹配的处理程序,则调用函数 std::terminate;在调用 std::terminate 之前是否展开堆栈是由实现定义的。 - j6t

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接