在阅读C ++中的智能指针时,大多数信息带有警告:
”警告:不会(可能)调用智能指针析构函数 异常退出等情况(通过调用std :: abort或 std :: exit()),或者当异常从线程的传播出去时 主函数或声明为noexcept的方法抛出 例外”。
我的问题是,在所有这些情况下,程序最终都会终止,在这种情况下,当清除进程的页表时,操作系统将收回智能指针指向的内存(我知道C ++标准不会讨论页表和虚拟内存,但我在这里提到,因为这是大多数操作系统的标准做法。
那么为什么发出此警告?如果不调用析构函数,最糟糕的事情是什么?还是这是在使用智能指针管理内存以外的资源时需要注意的警告?如果是,那么这些资源是什么?
答案 0 :(得分:2)
正如我在评论中已经说过的那样,该标准所讨论的情况是不应该发生的特殊情况。很有可能发生这种情况,您的程序将无法正常运行。因此它终止了,该标准不能保证所有析构函数都被正确调用。
解决方案是防止情况发生。
异常退出(通过调用std :: abort或std :: exit())
请勿致电abort
或exit
。让所有调用的函数返回并让main
执行return
。
或当异常从线程的主要功能传播出去时
捕获main
中的所有异常。然后return
。或者,如果没有全局对象,也可以abort
。
或当声明为noexcept的方法引发异常时。”
请勿抛出noexcept
函数。
可能出现的问题不仅与内存有关。删除其持有的指针的智能指针将触发其指向的对象的析构函数。该对象可能包含外部资源。例如,这些文件可以是一个文件(或套接字),在关闭文件之前应先对其进行刷新(写出缓冲的I / O)。也可能是与GPIO等低级硬件相关的东西,例如在操作过程中将其打开并在析构函数中将其关闭。