这只是乐观的:
但是对于大多数资源,这应该由操作系统在进程退出时自动处理
操作系统自动处理的唯一资源是“文件句柄”和“内存”(这可能因操作系统而异)。实际上,所有其他资源(如果有人有一个由操作系统自动处理的资源列表,我会喜欢的)需要由操作系统手动释放。
最好的办法是避免使用 terminate() 退出,并通过强制堆栈正确展开来尝试受控关闭。这将确保正确调用所有析构函数并释放您的资源(通过析构函数)。
关于我唯一要做的就是记录问题。这样当它发生时,我可以回去修复代码,这样它就不会再次发生。我喜欢我的代码很好地展开堆栈以进行资源释放,但这是一些人喜欢在事情变得糟糕时突然停止的观点。
我的终止时间列表被称为:
通常,当异常处理机制无法找到抛出异常的处理程序时调用它。一些具体的例子是:
- 异常转义 main()
- 注意:此处是否展开堆栈由实现定义。因此,我总是在 main 中捕获然后重新抛出(如果我没有明确处理)。这样我就保证了堆栈的展开(跨所有平台)并且仍然可以获得操作系统异常处理机制的好处。
- 两个异常同时传播。
- 当另一个异常正在传播时,一个异常会从析构函数中逃脱。
- 抛出的表达式会产生异常
- main 之前或之后的异常。
- 如果异常转义了全局对象的构造函数/析构函数。
- 如果异常转义函数静态变量的析构函数。(即小心非本地静态对象的构造函数/析构函数)
- 异常会转义使用 atexit() 注册的函数。
- 当前没有异常传播时重新抛出。
- 未列出的异常会转义具有异常说明符列表的方法/函数。