2011-01-09 3 views
7

Я искал способ делать безопасные векторы и карты динамических указателей, когда я понял, что C++ 11 добавляет unique_ptr. Я изучил, как использовать их в Google, но не смог найти подробностей. Что мне нужно знать, это следующее:Использование std :: unique_ptr со стандартными контейнерами

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

Это уникальное_ptr необходимое условие? Если безопасность - это ваша цель, std :: shared_ptr может быть альтернативой. –

ответ

13
  1. Ничего. A unique_ptr - это всего лишь обертка вокруг указателя, которая удаляет указатель при уничтожении unique_ptr. У него нет накладных расходов (точно так же, как и шаблон auto_ptr).
  2. Nope - это просто сработает. Трудность на самом деле исходит от , вставляя указатель на вектор или карту - тогда как вы должны переместитьunique_ptr в контейнер.
+0

Спасибо! Я был не совсем уверен, и не мог найти много на Google, поэтому я рад получить ответ. – OniLink

+1

+1 для хорошего объяснения, хотя вы можете заметить, что не более одного unique_ptr может указывать на ресурс, в то время как неограниченное количество исходных указателей может указывать на определенный ресурс. – templatetypedef

+2

+1, возможно, добавит пример вставки (особенно тот, который показывает, почему требуется переход). –

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

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

+0

+1 для 2. - очевидно, когда вы фокусируетесь на нем, но может быть проблемой при переходе от исходных указателей к интеллектуальным указателям, если вы только переходите «на полпути» с необработанными указателями, указывающими на освобожденную память, потому что элемент удален – kfmfe04