特殊情况下的智能指针析构函数 在阅读C++中的智能指针时,大多数信息都有一个警告:

特殊情况下的智能指针析构函数 在阅读C++中的智能指针时,大多数信息都有一个警告:,c++,c++11,c++14,smart-pointers,C++,C++11,C++14,Smart Pointers,“请注意,智能指针析构函数将(可能)不会被调用。” 异常退出(通过调用std::abort或 std::exit()),或者当异常从线程的 主函数或当声明为noexcept的方法引发 例外情况” 我的问题是,在所有这些情况下,程序最终都会终止,在这种情况下,当清除进程的页表时,操作系统会收回智能指针指向的内存(我知道C++标准不讨论页面表和虚拟内存,但我在这里提到它,因为这是大多数OSES中的标准实践)。 那么,为什么会发出此警告?如果未调用析构函数,最糟糕的情况是什么?或者,当我使用智能指针管

“请注意,智能指针析构函数将(可能)不会被调用。” 异常退出(通过调用std::abort或 std::exit()),或者当异常从线程的 主函数或当声明为noexcept的方法引发 例外情况”

我的问题是,在所有这些情况下,程序最终都会终止,在这种情况下,当清除进程的页表时,操作系统会收回智能指针指向的内存(我知道C++标准不讨论页面表和虚拟内存,但我在这里提到它,因为这是大多数OSES中的标准实践)。
那么,为什么会发出此警告?如果未调用析构函数,最糟糕的情况是什么?或者,当我使用智能指针管理内存以外的资源时,这是一个需要注意的警告?如果是,那么这些资源是什么?正如我在评论中所说,标准所讨论的情况是不应该发生的异常情况。如果发生这种情况,您的程序将无法正常运行的可能性非常高。因此它将被终止,并且标准不保证所有析构函数都被正确调用

解决办法是防止这种情况发生

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

不要调用
abort
exit
。让所有调用的函数返回,让
main
执行
返回操作

或者当异常从线程的主函数传播出去时

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

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

不要加入
noexcept
函数


可能出现的问题不仅与内存有关。删除它所持有的指针的智能指针会触发它所指向的对象的析构函数。该对象可能持有外部资源。例如,应该刷新的文件(或套接字)(写入缓冲I/O)在关闭之前。它也可能是与GPIO等低级硬件相关的东西,例如在操作过程中打开灯,然后在析构函数中关闭。

指向对象的析构函数可能同步并关闭外部资源,如串行线、文件、套接字,甚至可能设置一些GPIO。因此对于智能pointer这主要是关于释放内存,但对于它所持有的更多的对象来说可能是相关的。设计一个析构函数,将部分文件数据提交,其余部分放在队列中,然后拔掉插头。你的猜测和我的一样,最终是什么将其放入文件中的。通过套接字发送数据,然后中途终止连接。lis受影响的事物是无限的,只有想象。而且fwiw,没有智能指针,同样的问题也会发生,特别是使用
std::abort
。因此,我看到的唯一奇怪的是,该警告与智能指针的关联性。因此,当我使用智能指针管理这些问题时,无法保证ese将被关闭。那么程序员应该怎么做呢?因为我上面提到的情况将导致程序终止,并且它已经超出了您的控制范围。@AshishDaggubatti,当程序/线程像那样终止时,您不能做任何事情。标准只是正确地设置了程序的期望值。@AshishD阿古巴蒂:你问程序员能做什么?防止上述情况发生。在
main
中捕获异常。不要插入声明为
noexcept
的函数。不要调用
abort
exit
,让所有调用的函数返回,然后在
main
中执行
返回即可。