加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 02:59:31 所属栏目:百科 来源:网络整理
导读:C标准提供了std :: set_terminate函数,它可以指定什么函数std :: terminate应该实际调用. std :: terminate只能在可怕的情况下被调用,并且当标准描述的时候,它被称为是可怕的(例如一个未捕获的异常).当std :: terminate确实被调用时,这种情况似乎是不符合内
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()注册的函数.

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

>通过意外.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读