std :: unique_ptr是RAII的应用吗?

wrh*_*all 7 c++ unique-ptr

这是一个准确的描述吗?是否有意义?

您是否确保在unique_ptr超出范围之前不会删除它指向的对象[即使您没有使用unique_ptr]?

Ben*_*igt 13

是的,std::unique_ptr遵循RAII设计原则.

不,std::unique_ptr不会阻止其他代码做一些愚蠢的事情,比如调用delete属于该代码的指针unique_ptr.当它们之一时,unique_ptr它自己将在它拥有的对象上调用一个删除器1:

  1. 它超出了范围

要么

  1. unique_ptr被重新分配(通过operator=reset)指向一个不同的对象

也可以unique_ptr通过移动到不同的智能指针或使用release成员函数来撤销对象的所有权.这会破坏对象与之间的关联,unique_ptr并且unique_ptr不再清理对象.


1默认删除器将使用deletedelete [],具体取决于目标是否具有阵列类型.但是unique_ptr是一个模板,它的删除器可以自定义,例如a的清理操作FILE*可以选择为调用fclose.

此功能可用于计划unique_ptr在超出范围时发生的任意清除操作.RAII用于保持锁定,关闭文件等等 - 显然,如果早期执行清理操作只会因为编译器未看到智能指针的任何未来使用而存在重大问题.幸运的是,C++对象的生命周期规则是完全确定的(甚至在同一范围内的多个自动变量的破坏顺序也很明确),并且当智能指针本身被破坏时,您可以依靠智能指针清理其拥有的对象.