Идиоматическое использование std :: auto_ptr или только использование shared_ptr?

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

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

Что ты думаешь об этом?

19 голосов | спросил Roel 13 +04002008-10-13T12:56:56+04:00312008bEurope/MoscowMon, 13 Oct 2008 12:56:56 +0400 2008, 12:56:56

5 ответов


0

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

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

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

ответил Michael Burr 13 +04002008-10-13T19:52:00+04:00312008bEurope/MoscowMon, 13 Oct 2008 19:52:00 +0400 2008, 19:52:00
0

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

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

ответил MSalters 13 +04002008-10-13T13:34:03+04:00312008bEurope/MoscowMon, 13 Oct 2008 13:34:03 +0400 2008, 13:34:03
0

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

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

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

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

ответил Anthony Williams 13 +04002008-10-13T13:33:56+04:00312008bEurope/MoscowMon, 13 Oct 2008 13:33:56 +0400 2008, 13:33:56
0

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

ответил Konrad Rudolph 13 +04002008-10-13T13:20:24+04:00312008bEurope/MoscowMon, 13 Oct 2008 13:20:24 +0400 2008, 13:20:24
0

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

ответил Chris Jester-Young 13 +04002008-10-13T13:02:41+04:00312008bEurope/MoscowMon, 13 Oct 2008 13:02:41 +0400 2008, 13:02:41

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132