Контейнеры авто указателей - PullRequest
2 голосов
/ 20 мая 2010

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

Ответы [ 3 ]

11 голосов
/ 20 мая 2010

Элементы контейнера должны быть действительно копируемыми; auto_ptr нет. Если вы делаете копию, оригинал изменяется (он теряет право собственности). Boost :: shared_ptr может быть скопирован, так как два указателя впоследствии будут разделять владельца. Таким образом, его можно использовать в контейнере STL.

3 голосов
/ 20 мая 2010

Проблема с семантикой копирования в auto_ptr. Когда вы назначаете два авто указателя, RHS передаст владение памятью LHS. Это означает, что подпись присваивания: auto_ptr& operator=( auto_ptr& rhs ) (обратите внимание, что в RHS нет const), поэтому во многих случаях она даже не будет компилироваться.

Существуют и другие умные указатели, которые можно использовать с контейнерами. В TR1 есть shared_ptr, смоделированный после boost::shared_ptr (в некоторых компиляторах это просто код в boost только что скопированный и с измененными пространствами имен). Boost также имеет boost::unique_ptr, который будет заменой auto_ptr в следующем стандарте. Он моделирует одиночное владение с семантикой перемещения, так что его можно использовать внутри без дополнительных затрат на использование shared_ptr (хотя в большинстве случаев стоимость заметна).

0 голосов
/ 20 мая 2010

Насколько я знаю, у auto_ptrs возникают проблемы при копировании, поэтому его не следует использовать в контейнерах STL. shared_ptrs - ваш выбор.

...