C ++ 11 Smart Pointer Policies - PullRequest
       26

C ++ 11 Smart Pointer Policies

29 голосов
/ 01 декабря 2011

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

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

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

  1. Достаточно ли этих политик или есть дополнительные политики, которые Я должен знать?
  2. Действительно ли scoped_ptr<> и auto_ptr<> устарели?

1 Ответ

32 голосов
/ 01 декабря 2011

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

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

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

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

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

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

...