2008-10-13 5 views
19

Теперь, когда shared_ptr находится в tr1, что, по вашему мнению, должно произойти при использовании std::auto_ptr? Они оба имеют разные варианты использования, но все варианты использования auto_ptr могут быть решены с помощью shared_ptr. Вы откажетесь от auto_ptr или продолжите использовать его в тех случаях, когда вы хотите явно выразить, что только один класс имеет право владения в любой точке?Идиоматическое использование std :: auto_ptr или использование shared_ptr?

Я считаю, что использование auto_ptr может добавить ясность в код, точно добавив нюанс и указание на дизайн кода, но с другой стороны, это добавляет еще одну тонкую проблему при обучении новых программистов: им нужно понимать умные указатели и тонкие детали того, как они работают. Когда вы используете только один умный указатель повсюду, вы можете просто установить правило «обернуть все указатели в shared_ptr» и сделать с ним.

Как вы относитесь к этому?

ответ

13

Чтобы предоставить немного больше боеприпасов для лагеря «избегайте std::auto_ptr»: auto_ptr устарел в следующем стандарте (C++ 0x). Я думаю, что это один достаточно хороший боеприпас для любых аргументов, чтобы использовать что-то еще.

Однако, как указано в примечании Konrad Rudolph, замена по умолчанию для auto_ptr должна быть boost::scoped_ptr. Семантика scoped_ptr более близка к значениям auto_ptr и предназначена для аналогичных целей. Следующий стандарт C++ 09 будет иметь нечто подобное, называемое unique_ptr.

Однако использование shared_ptr в любом месте, которое должно быть использовано scoped_ptr, не будет ничего сломать, оно просто добавит очень незначительную неэффективность, чтобы иметь дело с подсчетом ссылок, если объект никогда не будет использоваться совместно. Поэтому для частных указателей-членов, которые никогда не будут переданы другому объекту, используйте scoped_ptr. Если указатель будет передан кому-то другому (это включает использование их в контейнерах или если все, что вы хотите сделать, это передать право собственности, а не хранить или делиться им) - используйте shared_ptr.

3

Я считаю, что «обернуть все указатели в shared_ptr» действительно должен быть режимом по умолчанию и является подходящим советом для ваших младших кодеров. Тем не менее, в случаях особого владения, о которых вы упоминали, auto_ptr действительно более уместен, и его использование следует поощрять при таких обстоятельствах.

5

Я считаю, что это лучше всего практика, чтобы заменить все виды использования std::auto_ptr по boost::scoped_ptr если std::tr1::shared_ptr не отвечает требованиям лучше, если вы не возражаете против использования Boost. С другой стороны, было очевидно, что scoped_ptr не был включен в TR1.

+0

scoped_ptr имеет свое применение, а именно однократное владение, которое не требует передачи. В таких случаях он должен заменить auto_ptr. Тем не менее, если односторонняя собственность, семантика передачи подходит, auto_ptr все равно должен использоваться. :-) – 2008-10-13 09:33:59

+0

Что делает scoped_ptr лучше, чем const auto_ptr? В Исключительном C++ есть пункт об auto_ptr, особенно о const auto_ptr; от чтения о scoped_ptr Я не вижу никаких преимуществ перед const auto_ptr. – Roel 2008-10-13 12:16:52

+0

`auto_ptr` может дать право собственности. Часто это не требуется. В принципе, `scoped_ptr` реализует только RAII для произвольного указателя в данном блоке. – 2008-10-13 13:37:09

11

«Использовать shared_ptr везде» является хорошим стандартом по умолчанию и, безусловно, хорошей отправной точкой для обучения людей ответственному использованию умных указателей. Однако это не всегда лучший выбор.

Если вам не требуется совместное владение, shared_ptr является излишним: он должен выделять отдельный блок памяти для подсчета ссылок, что может повлиять на производительность, и это менее понятно по документации.

Лично я использую std::auto_ptr во многих местах, где boost::scoped_ptr также будет достаточно: например. удерживая объект, выделенный в кучу, до того, как собственность передается в другом месте, где могут быть брошены промежуточные операции.

C++ 0x будет иметь std::unique_ptr для дополнения std::shared_ptr в качестве лучшей альтернативы std::auto_ptr. Когда он станет широко доступным, я начну использовать его.

28

auto_ptr тоже хорош в подписях. Когда функция принимает значение auto_ptr<T> по значению, это означает, что она будет потреблять T. Если функция возвращает auto_ptr<T>, ясно, что она отказывается от права собственности. Это может сообщить о ваших намерениях о жизни.

С другой стороны, использование scoped_ptr<T> подразумевает, что вы не хотите заботиться о времени жизни T. Это также означает, что вы можете использовать его в большем количестве мест. Оба умных указателя являются допустимыми вариантами, вы, безусловно, можете иметь как в одной программе.

 Смежные вопросы

  • Нет связанных вопросов^_^