可能的重复项:
std::auto_ptr to 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++不允许这样做?这两个智能指针之间的主要区别是什么?什么时候需要使用什么?
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));