Передача права собственности на функцию с помощью std::unique_ptr

Я пытаюсь научиться использовать умные указатели и понимать право собственности. Когда я передаю auto_ptr функции по значению, функция становится исключительным владельцем этого указателя. Поэтому, когда функция завершает работу, она удаляет указатель, который я ей передал.

Однако я получаю ошибку компиляции, когда пытаюсь сделать это с unique_ptr, как будто назначение копирования отключено для unique_ptrs. Передача unique_ptr по ссылке, похоже, не передает права собственности, она просто дает функции ссылку на unique_ptr.

Как мне получить поведение auto_ptr с передачей права собственности функции для работы с unique_ptrs? Я был бы признателен за ссылку на подробное руководство по unique_ptr, поскольку до сих пор те, которые я читал, говорят только о auto_ptr или говорят об интеллектуальных указателях, доступных с Boost, и, кажется, игнорируют unique_ptr, потому что shared_ptr покрывает его.


person newprogrammer    schedule 16.07.2012    source источник


Ответы (1)


Однако я получаю ошибку компиляции, когда пытаюсь сделать это с unique_ptr, как будто назначение копирования отключено для unique_ptrs.

Это. unique_ptr имеет одного и только одного владельца. Его нельзя скопировать, потому что это приведет к двум владельцам. Чтобы передать его по значению в другую функцию, первоначальный владелец должен отказаться от владения, используя std::move.

Чтобы использовать unique_ptr, вы должны понимать семантику перемещения.

auto_ptr - это просто хакерское приближение к истинной семантике ходов, которая на самом деле не работает. Лучше просто забыть о существовании этого класса.

person Puppy    schedule 16.07.2012
comment
@DeadMG Это фантастический связанный ответ. Я все еще задаюсь вопросом об одном: что происходит, когда переданное unique_ptr выходит за рамки? Это похоже на удаление NULL? - person newprogrammer; 16.07.2012
comment
@newprogrammer: Ничего. У него нет ресурсов, поэтому ничего не происходит. - person Puppy; 16.07.2012