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