微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

我们可以从C ++的构造函数中调用exit吗?

如何解决我们可以从C ++的构造函数中调用exit吗?

请考虑以下C ++代码

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

这合法吗?即在完成之前直接从构造函数退出。有任何副作用吗?

解决方法

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

,

这合法吗?

从技术上讲,是的。也就是说,我想不出合理的用例。

这有副作用吗?

exit具有终止进程的作用(静态对象被破坏;自动对象没有被破坏)。在构造函数中调用它不会改变它。

,

有不同的观点:

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

    是的。可以随时从C ++程序中调用exit函数,它将使程序尽快退出。

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

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

  • 是否存在合法代码?

    不。如果需要在对象构造函数内部中止,则应引发异常。如果没有捕获到异常,它确实会中止程序,但是会以一种干净的方式,确保任何构造对象(甚至构造对象的成员)都将调用其析构函数。任何来电者都有机会进行一些清理。

长话短说:从不做!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。