Есть ли причина использовать auto_ptr? - PullRequest
15 голосов
/ 29 декабря 2010

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

Мой вопрос: есть ли реальные задачи, где auto_ptr действительно полезен и хорошо там подходит?

Ответы [ 4 ]

14 голосов
/ 29 декабря 2010

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

Теперь, в мире «строгого C ++ 03 без повышения», я использую auto_ptr довольно часто, наиболее заметно:

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

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

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

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

Так что, если у вас нет выбора, auto_ptr не является хорошим выбором. Главным образом, потому что большинство компиляторов C ++ в наши дни реализуют move semantics и предоставляют unique_ptr.

2 голосов
/ 29 декабря 2010

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

1 голос
/ 29 декабря 2010

Я использую 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) записывает ссылку.

...