Передача auto_ptr функции эффективно превращает ее в приемник. Зачем? - PullRequest
5 голосов
/ 31 июля 2011

Я читаю некоторые заметки об общих указателях. Говорят, что первая попытка STL с auto_ptr имела следующие основные недостатки:

  • Их нельзя использовать в контейнерах STL
  • Копирование auto_ptr передает право собственности
  • Передача auto_ptr функции эффективно делает ее тонкой

Я понимаю первые два, но не уверен, что означает последний.

Может кто-нибудь, пожалуйста, объясните это.

Спасибо.

Ответы [ 3 ]

10 голосов
/ 31 июля 2011

Это потому, что после копирования auto_ptr в переменную вы утрачиваете право владения указателем на новую переменную.

Когда у вас есть:

void foo(std::auto_ptr<bar> x);

и выпозвоните foo с auto_ptr, вы сделаете копию auto_ptr для использования foo.Фактически передает владение на foo и, таким образом, указатель удаляется после завершения foo.

Это действительно удивительное поведение, которое заставило меня окончательно прекратить использование auto_ptr.Для простого RAII внутри блока try (основной вариант использования auto_ptr, как описано в книгах), используйте boost::scoped_ptr.

6 голосов
/ 31 июля 2011

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

Прочтите об этом в Эффективное использование auto_ptr .Херб Саттер объясняет это красиво и авторитетно.

0 голосов
/ 30 мая 2019

Данные сток - это то, что поглощает ваши данные и становится их владельцем.

Терминология берет свое начало в понятии "конвейеры", где некоторый конкретный объект в цепочке объектов берет свои данные из "источника", а затем отправляет свой результат в "приемник". Следующая сущность в цепочке делает то же самое и так далее. На каждом этапе сущность больше не может ничего делать с данными, которые ей передаются.

По аналогии (и в качестве примера) рассмотрите возможность получения данных из std::cin (потока, выступающего в качестве источника), выполнения некоторых вычислений и передачи результата в std::cout (потока, выступающего в качестве приемника). Как только вы закончите, вы закончите; результаты находятся в эфире, и вы не можете их вернуть.

Вот что делает auto_ptr: он передает право собственности на ваши данные, независимо от того, хотели вы этого или нет.

...