19

可能重复:
std::auto_ptr 到 std::unique_ptr
有哪些 C++ 智能指针实现可用?

可以说我有这个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++ 不允许这样做?这两个智能指针之间的主要区别是什么?当我需要使用什么?

4

1 回答 1

46

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));
于 2012-11-20T20:33:55.347 回答