В среде 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
кажется излишним …
В C ++ 03 я бы использовал либо пустой указатель, либо auto_ptr
и пусть вызывающая сторона решит, какая стратегия владения
Обратите внимание, что одной из ловушек умных указателей является то, что ковариационная не относится к ним, а это означает, что вы можете переопределить Base* f()
от Derived* f()
но вы не можете переопределить std::x_ptr<Base> f()
от std::x_ptr<Derived> f()
; и, таким образом, в этом случае у вас нет выбора, кроме как использовать простой указатель.
Я бы использовал shared_ptr
или необработанный указатель, потому что auto_ptr
считается плохой идеей.
Это действительно зависит от вашего владение семантика. Кто уничтожит принадлежащий ресурс?
Отказ от ответственности: этот ответ чисто применимо к использованию 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.