Unique_ptr VS auto_ptr - программирование
Подтвердить что ты не робот

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, я получаю ошибку компилятора. Почему С++ не позволяет это? И каковы основные различия между этими двумя умными указателями? Когда мне нужно что-то использовать?

4b9b3361

Ответ 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));