Использование std::unique_ptr со стандартными контейнерами

Я искал способ сделать безопасные векторы и карты динамических указателей, когда понял, что С++ 11 добавляет unique_ptrs. Я изучал, как их использовать в Google, но не смог найти подробностей. Мне нужно знать следующее:

  1. Что именно отличается между указателями и unique_ptr, кроме автоматического сбора памяти?
  2. Как мне удалить unique_ptr из вектора или карты? Есть ли какой-то специальный код, который я должен использовать, кроме стирания итератора?

person OniLink    schedule 09.01.2011    source источник
comment
Является ли unique_ptr необходимым условием? Если безопасность — ваша цель, альтернативой может быть std::shared_ptr.   -  person Ise Wisteria    schedule 09.01.2011


Ответы (2)


  1. Ничего такого. unique_ptr — это просто оболочка вокруг указателя, которая удаляет указатель при уничтожении unique_ptr. Он не имеет накладных расходов (как и шаблон auto_ptr, который он заменяет).
  2. Нет - это просто сработает. На самом деле трудность связана с вставкой указателя в вектор или карту, тогда как вы должны переместить unique_ptr в контейнер.
person Billy ONeal    schedule 09.01.2011
comment
Спасибо! Я не совсем был уверен и не смог найти многого в Google, поэтому я рад получить ответ. - person OniLink; 09.01.2011
comment
+1 за хорошее объяснение, хотя вы, возможно, захотите отметить, что не более одного unique_ptr может указывать на ресурс, в то время как неограниченно большое количество необработанных указателей может указывать на конкретный ресурс. - person templatetypedef; 09.01.2011
comment
+1, возможно, поможет добавление примера вставки (особенно того, который показывает, почему требуется перемещение). - person Matthieu M.; 09.01.2011

  1. Разница в том, что unique_ptr подчиняется семантике перемещения. Кроме того, как следует из названия, вы не можете делать его копии.

  2. Стирание элемента std::vector<std::unique_ptr<T> > фактически удалит все, на что указывает этот указатель.

person Edward Strange    schedule 09.01.2011
comment
+1 за 2. - очевидно, когда вы фокусируетесь на этом, но может быть проблемой при переходе от необработанных указателей к умным указателям, если вы пройдёте только половину пути с необработанными указателями, указывающими на освобожденную память, потому что элемент был удалён - person kfmfe04; 03.12.2011