unique_ptr VS auto_ptr

时间:2012-11-20 20:29:53

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

  

可能重复:
  std::auto_ptr to std::unique_ptr
  What C++ Smart Pointer Implementations are available?

让我说我有struct

struct bar 
{ 

};

当我像这样使用 auto_ptr 时:

void foo() 
{ 
   auto_ptr<bar> myFirstBar = new bar; 
   if( ) 
   { 
     auto_ptr<bar> mySecondBar = myFirstBar; 
   } 
}

然后在auto_ptr<bar> mySecondBar = myFirstBar; C ++将所有权从myFirstBar传输到mySecondBar,并且没有编译错误。

但是当我使用 unique_ptr 而不是 auto_ptr 时,我收到编译错误。为什么C ++不允许这样?这两个智能指针之间的主要区别是什么?当我需要使用什么?

1 个答案:

答案 0 :(得分:43)

std::auto_ptr<T>可能会默默地窃取资源。这可能令人困惑,并试图定义std::auto_ptr<T>不让你这样做。 std::unique_ptr<T>所有权不会从您仍然保留的任何内容中默默转移。它仅将所有权从您没有句柄的对象(临时)或即将离开的对象(对象即将超出函数中的作用域)转移。如果您确实想转让所有权,请使用std::move()

std::unique_ptr<bar> b0(new bar());
std::unique_ptr<bar> b1(std::move(b0));