如果是一个C ++终止处理正确的事(TM)?(When is a C++ terminate han

2019-06-24 10:30发布

C ++标准提供std::set_terminate功能,它可以让你指定什么功能std::terminate实际上应该叫。 std::terminate只应被调用在可怕的情况,果然标准的描述时,它呼吁的情况是可怕的(例如未捕获的异常)。 当std::terminate不会被调用的情况似乎analagous到被淘汰的记忆-有没有真正太多可以做的理智。

我读过,它可以被用来确保资源被释放 - 但对于大多数资源,这应该是由操作系统自动处理当进程退出(如文件句柄)。 从理论上讲,我可以看到,如果说,你需要因撞车退出时发送服务器的特定消息的情况。 但大部分时间的OS的处理应该是足够的。

当使用终止处理正确的事(TM)?

更新: 感兴趣的是可以用定制来完成终止处理程序的人可能会发现这个不可移植招有用。

Answer 1:

这仅仅是乐观的:

但对于大多数资源本应自动被OS时处理进程退出

关于该操作系统处理的唯一资源是自动“文件句柄”和“Memory”(这可能跨操作系统的不同)。 实际上,所有其他资源(如果有人有由操作系统的自动处理资源的名单我会爱)需要由OS手动释放。

最好的办法是避免使用退出终止(),并试图通过迫使堆栈正确放松身心的受控关闭。 这将确保所有的析构函数正确调用和你的资源被释放(通过析构函数)。

关于我会做的唯一事情就是登录的问题。 所以,当它确实发生了,我可以回去和修复代码,以便它不会再次发生。 我喜欢我的代码放松对资源释放栈很好,但是这是一个意见有些人喜欢突然死机当事情搞砸。

我当终止的列表被称为:

一般来说,当异常处理机制无法找到一个抛出的异常处理程序被调用。 一些具体的例子是:

  • 例外逃脱的main()
    • 注:这是定义堆栈是否在这里展开实施。 因此,我总是赶在主,然后重新抛出(如果我没有明确的处理)。 这样,我保证栈展开(跨所有平台),并仍然得到OS的异常处理机制的好处。
  • 两个例外同时传播。
    • 例外逃脱一个desatructor而另一个异常被传播。
    • 抛出的表达产生异常
  • 之前或之后,主例外。
    • 如果一个异常逃脱一个全局对象的构造函数/析构函数。
    • 如果一个异常逃逸函数静态变量的析构函数。 (即小心构造/非局部静态对象的析构函数)
    • 例外逃脱()使用atexit注册的功能。
  • 一重投时也不例外,目前传播。
  • 未列出的例外逃脱的方法/功能有异常说明列表。
    • 通过意外。


Answer 2:

马丁纽约的发言类似的答案 ,我大概在自定义唯一要做的终止处理程序是登录的问题,所以我可以找出并纠正有问题的代码。 这是我发现,使用自定义终止处理程序是正确的事的唯一实例。


因为它是实现定义堆栈是否被退绕之前std::terminate()被调用时,我有时添加代码以产生一回溯 ,以找到未捕获的异常1。

1)这似乎是在Linux平台上使用GCC时为我工作。



Answer 3:

我认为正确的问题是如何避免呼叫终止处理程序,而不是在使用它。



文章来源: When is a C++ terminate handler the Right Thing(TM)?