什么时候是C终止处理程序Right Thing(TM)?

前端之家收集整理的这篇文章主要介绍了什么时候是C终止处理程序Right Thing(TM)?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
C标准提供了std :: set_terminate函数,它可以指定什么函数std :: terminate应该实际调用. std :: terminate只能在可怕的情况下被调用,并且当标准描述的时候,它被称为是可怕的(例如一个未捕获的异常).当std :: terminate确实被调用时,这种情况似乎是不符合内存的 – 你没有太多的理由可以做到这一点.

我已经看到它可以用来确保资源被释放 – 但是对于大多数资源,这个过程将在操作系统退出自动处理(例如文件句柄).理论上我可以看到一个例子,如果说,你需要发送一个服务器特定的消息,由于崩溃退出.但大多数时候操作系统的处理应该是足够的.

何时使用终止处理程序Right Thing(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()

>注意:这是实现定义堆栈是否在这里展开.
因此,我总是抓住主,然后重新抛出(如果我没有明确处理).
这样我保证堆栈(跨所有平台)的解放,并且仍然得到操作系统异常处理机制的好处.

>两个异常同时传播.

>一个异常转义一个解析器,而另一个异常传播.
抛出的表达式产生异常

>主要之前或之后的例外.

>如果异常转义全局对象的构造函数/析构函数.
>如果异常转义函数静态变量的析构函数.
(即注意非本地静态对象的构造函数/析构函数)
>异常转义使用atexit()注册函数.

>当没有异常正在传播的时候重新抛出.
>未列出的异常转义具有异常说明符列表的方法/函数.

>通过意外.

猜你在找的C&C++相关文章