2013-07-19 2 views
4

Допустим, я StD :: список некоторого класса T.Raw против уникальных указателей в списке

Что такое лучший способ управлять этими элементами? Учитывая, что только менеджер (я имею в виду - один владелец) может добавлять или удалять элементы из списка.

1)

std::list < T* > myList; 

//adding the new element 
myList.push_back(new T(..)); 

//deleting the one element 
...roaming through the list...got it... 
delete *iterator; 
myList.erase(iterator); 

2)

std::list < std::unique_ptr<T> > myList; 

//adding the new element 
myList.push_back (std::unique_ptr<T>(new T(..)); 

//deleting the one element 
...roaming through the list...got it... 
myList.erase(iterator); 
+0

«зависит» - хороший ответ, но я бы пошел с2 в большинстве случаев. Перемещение семантики сделает все удаление для вас, что является просто болью в butt в противном случае. – IdeaHat

+0

Что случилось с 'std :: list '? –

+3

Вам нужно хранить указатели (возможно, для полиморфизма)? Если нет, 'std :: list ' будет лучше. –

ответ

1

Если модель владения в вашей программе состоит в том, что список «владеет» элементами внутри него, то второй способ (то есть с unique_ptr<T>) лучше. Он позволяет C++ автоматически управлять ресурсами вашего списка, что особенно важно в ситуациях, когда список объявляется в локальной области, потому что вам не нужно беспокоиться о выходе из области преждевременно.

+0

Что делать, если мне нужно удалить свой объект прямо сейчас? Как насчет мусора c. в этом случае? –

+0

@AlexeyTeplyakov Если вы должны удалить объект внутри списка, не касаясь списка, это означает, что ваша модель владения отличается от «список владеет объектами внутри него»; если список действительно владеет его объектами, так как использование 'unique_ptr ' предполагает, что удаление объекта должно быть выполнено путем стирания его 'unique_ptr ' из списка. Также обратите внимание, что «простые» указатели не дают вам преимуществ или недостатков в случае, если вы должны удалить объект. – dasblinkenlight

+0

Ты ошибаешься. Будет ли задержка в удалении с помощью сборщика мусора? В случае уникального ptr –

3

В словах Herb Sutter's GotW column:

Рекомендации: Для того, чтобы выделить объект, предпочитают писать make_unique по умолчанию, и напишите make_shared, когда вы знаете, что время жизни объекта равно будет менеджером с помощью shared_ptrs.

std::list < std::unique_ptr<T> > myList; 

//adding the new element 
myList.push_back (std::make_unique<T>(..)); 

//deleting the one element 
...roaming through the list...got it... 
myList.erase(iterator); 

Вы можете использовать Stephan T. Lavavej-х accepted C+14 proposal для станд :: make_unique реализации.

+0

1) Есть ли std :: make_unique в C++ 11? 2) Что делать, если мне нужно удалить свой объект прямо сейчас? Как насчет мусора c. в этом случае? –

+0

@ Алексей Тепляков: Нет; надеюсь, что это будет в C++ 14. –

+0

@AlexeyTeplyakov, удаляющий указатель из контейнера, вызовет деструктор указанного элемента. Нет необходимости в «голом» удалении. – TemplateRex

Смежные вопросы