特殊情况下的智能指针析构函数

时间:2018-12-12 06:10:58

标签: c++ c++11 c++14 smart-pointers

在阅读C ++中的智能指针时,大多数信息带有警告:

  

”警告:不会(可能)调用智能指针析构函数   异常退出等情况(通过调用std :: abort或   std :: exit()),或者当异常从线程的传播出去时   主函数或声明为noexcept的方法抛出   例外”。

我的问题是,在所有这些情况下,程序最终都会终止,在这种情况下,当清除进程的页表时,操作系统将收回智能指针指向的内存(我知道C ++标准不会讨论页表和虚拟内存,但我在这里提到,因为这是大多数操作系统的标准做法。

那么为什么发出此警告?如果不调用析构函数,最糟糕的事情是什么?还是这是在使用智能指针管理内存以外的资源时需要注意的警告?如果是,那么这些资源是什么?

1 个答案:

答案 0 :(得分:2)

正如我在评论中已经说过的那样,该标准所讨论的情况是不应该发生的特殊情况。很有可能发生这种情况,您的程序将无法正常运行。因此它终止了,该标准不能保证所有析构函数都被正确调用。

解决方案是防止情况发生。

  

异常退出(通过调用std :: abort或std :: exit())

请勿致电abortexit。让所有调用的函数返回并让main执行return

  

或当异常从线程的主要功能传播出去时

捕获main中的所有异常。然后return。或者,如果没有全局对象,也可以abort

  

或当声明为noexcept的方法引发异常时。”

请勿抛出noexcept函数。

可能出现的问题不仅与内存有关。删除其持有的指针的智能指针将触发其指向的对象的析构函数。该对象可能包含外部资源。例如,这些文件可以是一个文件(或套接字),在关闭文件之前应先对其进行刷新(写出缓冲的I / O)。也可能是与GPIO等低级硬件相关的东西,例如在操作过程中将其打开并在析构函数中将其关闭。

相关问题