可能重复:
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 ++不允许这样?这两个智能指针之间的主要区别是什么?当我需要使用什么?
答案 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));