前言

  • std::auto_ptr 使用了它的复制操作来完成移动任务。这导致了令人奇怪的代码(拷贝一个std::auto_ptr会将它本身设置为null!)和令人沮丧的使用限制(比如不能将std::auto_ptr放入容器)。
  • 除非是C++98编译的场景,否则使用std::unique_ptr来替换std::auto_ptr,不要回头。

条款18: 使用std::unique_ptr管理具备专属所有权的资源

  • 默认情况下大小和裸指针基本相同。
  • std::unique_ptr实现的是专属所有权语义。
  • 是个只移型别,不允许复制。
  • 当一个工厂函数返回的std::unique_ptr被移动到一个容器中,该容器的元素又被移动到某对象的数据成员中,而稍后该对象又被析构这样的场景。在这种情况下,该对象的std::unique_ptr数据成员将随着对象主体的析构而被析构,从而引发工厂函数返回资源也被析构。
  • 默认地,资源析构采用delete运算符实现,但可以指定自定义删除器。有状态的删除器和采用函数指针实现的删除器会增加std::unique_ptr型别的对象尺寸。所以使用无捕获的lambda表达式是更好的选择。
  • std::unique_ptr可以高效地转换成std::shared_pte,正是这一特性使得std::unique_ptr如此适合作为工厂函数的返回型别。