Есть ли причина использовать auto_ptr?

После прочтения объяснения Jossutis на auto_ptr из его книги STL у меня сложилось сильное впечатление, что всякая задача, которую я попытаюсь использовать в I, я бы на 100% потерпел неудачу из-за одной из многих ошибок auto_ptr.

Мой вопрос: существуют ли какие-либо реальные задачи, когда auto_ptr действительно полезен и хорошо подходит?

Ответы

Ответ 1

Ясно, что auto_ptr проигрывает против unique_ptr.

Теперь, в мире "строгого С++ 03 без boost", я часто использую auto_ptr, наиболее заметно:

  • Для 'factory функций-членов', которые возвращают динамически выделенный экземпляр данного типа: мне нравится тот факт, что использование std::auto_ptr в обратном типе объясняет, что объект должен быть удален
  • В функциях, которые выделяют объект, прежде чем пытаться вставить его в контейнер позже: например, для release(), только если std::map<>::insert возвращает эту вставку успешно
  • В процедуре потока, которая выставляет элементы из очереди сообщений, мне нравится хранить pop'ed-элемент в const std::auto_ptr, чтобы было ясно, что сообщение будет уничтожено независимо от того, что.

Ответ 2

Я бы сказал, что его можно использовать, но это не самый лучший вариант.

Во-первых, это вопрос года или меньше, а auto_ptr официально устарел. Во-вторых, существует превосходная альтернатива: unique_ptr. Dr. Страуструп однажды сказал о unique_ptr:

"Какой должен быть auto_ptr" (но что мы не могли писать на С++ 98)

Поэтому, если у вас нет выбора, auto_ptr не является хорошим выбором. В основном, поскольку большинство компиляторов С++ в наши дни реализуют move semantics и предоставляют unique_ptr.

Ответ 3

В простых сценариях, когда вам нужно временно контролировать выделенный кучей объект auto_ptr, можно использовать без проблем. Например, если вам нужно условно создать объект, который будет использоваться только внутри одной функции, вы не можете выделить его в стеке, а auto_ptr позволяет вам не заботиться о времени жизни объекта, если возникает исключение.

Ответ 4

Я использую std::auto_ptr умеренно часто, чтобы обеспечить безопасность исключений. То есть, чтобы предотвратить утечку памяти в случае части метода, генерирующего исключение.

Например:

Foo &Container::addFoo(
   const std::string &name
   )
{
  // The post conditions of the method require that the new Foo
  // has been added to this container, but the addition method
  // may throw exceptiona
  std::auto_ptr< Foo > foo(new Foo(name));

  foo->twiddle();// may throw
  this->addFoo(*foo);// record reference. May throw

  return *foo.release();
}

Отредактировано: пояснил, что this->addFoo(*foo) записывает ссылку.