gpt4 book ai didi

c++ - C++ 终止处理程序何时才是正确的事情 (TM)?

转载 作者:可可西里 更新时间:2023-11-01 15:23:49 26 4
gpt4 key购买 nike

C++ 标准提供了 std::set_terminate 函数,它允许您指定 std::terminate 应该实际调用的函数。 std::terminate 应该只在可怕的情况下被调用,并且当它被调用时标准描述的情况确实是可怕的(例如未捕获的异常)。当 std::terminate 确实被调用时,情况似乎与内存不足类似——实际上您可以明智地做的事情并不多。

我读到它可以用来确保资源被释放——但是对于大多数资源来说,这应该在进程退出时由操作系统自动处理(例如文件句柄)。从理论上讲,我可以看到一个案例,如果说,您需要在因崩溃而退出时向服务器发送特定消息。但大多数时候操作系统处理应该足够了。

什么时候使用终止处理程序才是正确的做法 (TM)?

更新:People interested in what can be done with custom terminate handlers might find this non-portable trick useful.

最佳答案

这只是乐观:

but for the majority of resources this should be handled automatically by the OS when the process exits

操作系统自动处理的唯一资源是“文件句柄”和“内存”(这可能因操作系统而异)。实际上所有其他资源(如果有人有一个由操作系统的 I 自动处理的资源列表会喜欢的)需要由操作系统手动释放。

最好的办法是避免使用 terminate() 退出,并尝试通过强制堆栈正确展开来控制关闭。这将确保正确调用所有析构函数并释放您的资源(通过析构函数)。

我唯一要做的就是记录问题。这样当它确实发生时,我可以返回并修复代码,这样它就不会再次发生。我喜欢我的代码很好地展开堆栈以重新分配资源,但这是一些人的观点,他们喜欢在事情变得糟糕时突然停止。

我的终止调用列表:

通常在异常处理机制找不到抛出异常的处理程序时调用它。一些具体的例子是:

  • 异常逃逸 main()
    • 注意:堆栈是否在此处展开​​由实现定义。因此,我总是在 main 中捕获然后重新抛出(如果我没有明确处理)。这样我就可以保证堆栈展开(跨所有平台)并且仍然可以获得操作系统异常处理机制的好处。
  • 两个异常同时传播。
    • 当另一个异常正在传播时,一个异常从 desastructor 中逃脱。
    • 被抛出的表达式产生异常
  • main 之前或之后的异常。
    • 如果异常从全局对象的构造函数/析构函数中逃逸。
    • 如果异常逃脱了函数静态变量的析构函数。(即小心非本地静态对象的构造函数/析构函数)
    • 异常转义使用 atexit() 注册的函数。
  • 当前没有传播异常时重新抛出。
  • 未列出的异常会转义具有异常说明符列表的方法/函数。
    • 出乎意料。

关于c++ - C++ 终止处理程序何时才是正确的事情 (TM)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1058797/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com