Я нашел существующие ответы великолепными, но из PoV указателей.ИМО, идеальный ответ должен иметь перспективный ответ пользователя / программиста.
Перво-наперво (как указал Джерри Коффин в своем ответе)
- auto_ptr можно заменить на shared_ptr или unique_ptrв зависимости от ситуации
shared_ptr: Если вас беспокоит освобождение ресурса / памяти И если у вас более одной функции, которая может использовать объект в разное время, тогдаперейдите к shared_ptr.
По DIFFERENT-Times, представьте себе ситуацию, когда object-ptr хранится в нескольких структурах данных и к ним позже обращаются.Несколько потоков, конечно, еще один пример.
unique_ptr: Если все, что вас беспокоит, это освобождение памяти и доступ к объекту SEQUENTIAL, то перейдите к unique_ptr.
Под ПОСЛЕДОВАТЕЛЬНЫМ, я имею в виду, в любой момент объект будет доступен из одного контекста.Например, объект, который был создан и использовался сразу после создания создателем.После создания объект сохраняется в FIRST структуре данных.Затем либо объект уничтожается после ОДНОЙ структуры данных, либо перемещается в SECOND структуру данных.
Из этой строки я буду называть общий / уникальный _ptr умными указателями.(auto_ptr также является умным указателем, НО из-за недостатков в его дизайне, для которых они устарели, и которые, я думаю, я укажу в следующих строках, они не должны группироваться с умным указателем.)
Единственная наиболее важная причина того, почему auto_ptr устарел в пользу smart-указателя, это присваивание-семантика Если бы не было этой причины, они бы добавили все новые плюсы семантики перемещенияв auto_ptr вместо того, чтобы осудить его.Так как семантика присваивания была наиболее неприязненной функцией, они хотели, чтобы эта функция исчезла, но поскольку написан код, использующий эту семантику (который комитет по стандартам не может изменить), им пришлось отказаться от auto_ptr вместоего изменение.
По ссылке: http://www.cplusplus.com/reference/memory/unique_ptr/operator=/
Вид назначений, поддерживаемый unqiue_ptr
- назначение перемещения (1)
- назначение нулевого указателя (2)
- назначение приведения типа (3)
- копирование назначения (удалено!) (4)
От: http://www.cplusplus.com/reference/memory/auto_ptr/operator=/
Вид назначений, поддерживаемых auto_ptr
- Копирование назначений (4) виновник
Теперь рассмотрим причину, по которой само назначение копии было настолько неприязненным, у меня есть такая теория:
- Не все программисты читают книги или стандарты
- auto_ptr на первый взгляд, обещает вам владение объектом
- little- * (каламбур предназначен), пункт auto_ptr,который не читается всеми программистами, разрешает присваивать один auto_ptr другому и передает право собственности.
- Исследования показали, что это поведение предназначено для 3,1415926535% всего использования и непреднамеренно в других случаях.
Непреднамеренное поведение действительно не нравится и, следовательно, неприязнь к auto_ptr.
(Для 3.1415926536% программистов, которые намеренно хотят передать право владения C ++ 11, дали им std:: move (), что сделало их намерение кристально понятным для всех интернов, которые собираются читать и поддерживать код.)