Подтвердить что ты не робот

С++ 11 Политика интеллектуального указателя

Как я понимаю, в текущей спецификации С++ 11 следует использовать:

  • std::unique_ptr<> для одного владельца (большую часть времени)
  • std::shared_ptr<> только при наличии нескольких владельцев в ациклической структуре
  • std::weak_ptr<> экономно только тогда, когда есть циклы, которые необходимо сломать
  • Необработанный указатель как дескриптор в память (без права собственности), когда ссылки не хватит

Итак, мои вопросы:

  • Являются ли эти политики достаточными или существуют дополнительные политики, которые Я должен знать?
  • Эффективны ли scoped_ptr<> и auto_ptr<>?
4b9b3361

Ответ 1

Действительно ли scoped_ptr < > и auto_ptr > эффективно устарели?

auto_ptr устарел на С++ 11, так что там ваш ответ. scoped_ptr не существует в С++ 11 и никогда этого не делал. Основная причина использования boost::scoped_ptr заключается в том, чтобы гарантировать, что право собственности никогда не передается (если вы, конечно, не обманываете). Опять же, если вы используете unique_ptr, право собственности может быть передано только при использовании std::move или подобных конструкций. Или, как указывает Говард, просто сделайте его const std::unique_ptr.

Значит, это действительно зависит от того, хотите ли вы эту дополнительную битву страхования. Кроме того, boost::scoped_ptr не имеет поддержки делетера. Таким образом, unique_ptr может воспроизводить трюки, которые boost::scoped_ptr не могут.

std:: weak_ptr < > экономно только тогда, когда существуют периоды, которые необходимо сломать

Я не могу сказать, что я согласен с этой политикой. A weak_ptr следует использовать, когда объект может захотеть поговорить с чем-то другим, но он не владеет чем-то другим. Это означает, что его можно удалить в любое время, и владелец weak_ptr должен иметь возможность обрабатывать это удаление в любое время, когда он пытается с ним поговорить.

Разрывные циклы являются одним из видов использования weak_ptr; это не должен быть единственный раз, когда он используется.