Я не могу использовать std :: vector из auto_ptr - я должен использовать shared_ptr? - PullRequest
5 голосов
/ 15 марта 2010

Мне не нужно делиться объектами, но я хочу убедиться, что утечка памяти не происходит. Правильно ли использовать shared_ptr в этом случае?

Ответы [ 4 ]

7 голосов
/ 15 марта 2010

Если вы используете boost, boost :: ptr_vector может лучше подойти для ваших нужд.

Если нет, то вы можете использовать shared_ptr, как вы предлагали, или вручную удалить элементы вектора, как только вы закончите с ними.

С точки зрения обслуживания, shared_ptr будет предпочтительным решением. Однако обратите внимание, что shared_ptr может принести некоторые потери производительности, которые могут или не могут быть значительными для вашего приложения.

4 голосов
/ 15 марта 2010

Если низкоуровневая производительность / использование памяти не являются критическими требованиями (т.е. 97% всех случаев), тогда просто используйте shared_ptr. Это просто и понятно.

Если вы действительно хотите держать вещи в узде и / или более точно выражать намерение владения, тогда boost :: ptr_vector может быть лучше - но если ваш класс не управляет какой-либо другой памятью, просто удалите вручную в твоем деструкторе не такой большой грех, как нам иногда приходится верить ;-) Я большой сторонник RAII, но время от времени делаю это.

2 голосов
/ 15 марта 2010

Это немного излишне, но для этого нет лучшего умного указателя. Вы могли бы также рассмотреть контейнеры указателя Boost.

В C ++ 0x вы сможете хранить std::unique_ptr в контейнерах, что ближе к вашим потребностям.

1 голос
/ 15 марта 2010

Вы также можете использовать Boost.PointerContainer . Использование shared_ptr означает совместное владение. Теперь, если вы уверены, что ваши объекты связаны с временем жизни контейнера, тогда PointerContainer - лучший вариант для разработки (это даже слово?).

...