auto_ptr или shared_ptr

В среде C ++ 03 вы бы использовали auto_ptr или (повышение) shared_ptr вернуть ресурс из функции? (Где в C ++ 11 естественно использовать unique_ptr.)

auto_ptr<T> f() {
...
return new T();
}

или же

shared_ptr<T> f() {
...
return new T();
}

auto_ptr имеет довольно много подводных камней (не в последнюю очередь, что это строительство ужасно глючит на MSVC 2005 что я должен использовать), но shared_ptr кажется излишним …

3

Решение

В C ++ 03 я бы использовал либо пустой указатель, либо auto_ptr и пусть вызывающая сторона решит, какая стратегия владения

Обратите внимание, что одной из ловушек умных указателей является то, что ковариационная не относится к ним, а это означает, что вы можете переопределить Base* f() от Derived* f() но вы не можете переопределить std::x_ptr<Base> f() от std::x_ptr<Derived> f(); и, таким образом, в этом случае у вас нет выбора, кроме как использовать простой указатель.

6

Другие решения

Я бы использовал shared_ptr или необработанный указатель, потому что auto_ptr считается плохой идеей.

Это действительно зависит от вашего владение семантика. Кто уничтожит принадлежащий ресурс?

1

Отказ от ответственности: этот ответ чисто применимо к использованию auto_ptr с ошибочной реализацией, такой как в VS2005.

Я добавлю свой собственный вид после попытки с auto_ptr на VS 2005:

В прошлом я уже успешно использовал auto_ptr (на этом VC ++ 8) в чисто локальных контекстах, а именно:

auto_ptr<T> local( ... ); // Don't use "=" to init! Will Crash on VS2005!
// use local
...
// Sometimes:
m_managing_object.setStuff( local.release() );
// Or, alternatively:
return local.release();

Это сработало достаточно хорошо, и единственное, что могло сработать, это использовать синтаксис присваивания для init, который просто каждый раз надежно завершался сбоем, так что это не имело большого значения.

Таким образом, соглашаясь на подразумеваемую семантику, упомянутую другими, я попытался заставить свой начальный пример работать

auto_ptr<T> f() {
...
return new T();
}
...
auto_ptr<T> pT( f() ); // or "=" init??, Variations ...
...

Потерпеть поражение!

Поработав с этим тривиальным примером около 1:30, я еще не выяснил почему и как именно auto_ptr разбился каждый раз, когда использовал этот способ.

Я почти уверен, что это связано с ошибочной реализацией VS2005, то есть я, возможно, сделал что-то совершенно безумное, что бы безошибочная реализация поймала, но здесь она рухнула, и я не смог сделать это правильно.

Что это значит: это значит, что я использую VS2005 с C ++ уже более 5 лет, я довольно уверен в отладке даже самых странных сценариев, и спустя час я еще не выяснил, что я сделал не так. Я уверен, что в конце концов узнал бы, но если вещь так чертовски проста в использовании, я бы лучше использовал shared_ptr и покончим с этим. Черт, даже возврат необработанного указателя лучше, по крайней мере, худшее, что вы получите с этим, — это утечка памяти (легко обнаруживаемая).

Итак: держитесь подальше от всего, кроме самых тривиальных вариантов использования auto_ptr на VS2005.

0
По вопросам рекламы [email protected]