Unique_ptr VS auto_ptr
Возможный дубликат:
std:: auto_ptr в std:: unique_ptr
Какие возможности С++ Smart Pointer доступны?
Скажем, у меня есть это struct
:
struct bar
{
};
Когда я использую auto_ptr следующим образом:
void foo()
{
auto_ptr<bar> myFirstBar = new bar;
if( )
{
auto_ptr<bar> mySecondBar = myFirstBar;
}
}
тогда в auto_ptr<bar> mySecondBar = myFirstBar;
С++ переносит право собственности с myFirstBar на mySecondBar и не возникает ошибка компиляции.
Но когда я использую unique_ptr вместо auto_ptr, я получаю ошибку компилятора. Почему С++ не позволяет это? И каковы основные различия между этими двумя умными указателями? Когда мне нужно что-то использовать?
Ответы
Ответ 1
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));