2015-02-24 2 views
0

Какая разница между unique_ptr<list<Struct>> и list<unique_ptr<Struct>>? Будет ли list<unique_ptr<Struct>> привести к тому, что в памяти также будут автоматически управляться элементы?Контейнеры Unique_ptr или unique_ptr элементы

+2

Первый - это указатель на список, второй - список указателей. Второй обычно используется в случае полиморфных объектов (является ли 'Struct' базовым классом?), Первое странно. – milleniumbug

+0

Да, я понимаю эту часть. В основном меня беспокоит то, как распределение памяти работает в обоих случаях. Будет ли первый выделять элементы в стеке или куче? Второй из них довольно очевиден, элементы находятся в куче, информация управления списками находится в стеке. Как насчет первого? –

+0

@SidharthMudgal: Оба будут выделять элементы в куче; вот что делают стандартные контейнеры. В первом случае сама структура списка также находится в куче, что является странным. Во втором, каждый элемент, выделенный в кучу, является указателем на дополнительный объект, выделенный для кучи. Если вам не нужна эта дополнительная косвенность по какой-либо причине (например, полиморфизм), она должна быть «list ». Или, скорее, 'vector '. –

ответ

1
  • Очевидная разница в том, что вы должны определить list<unique_ptr<Struct>> в точке строительства, в то время как при сооружать unique_ptr<list<Struct>> это может быть просто nullptr
  • list<unique_ptr<Struct>> имеет незначительную нагрузку хранения все указатели
  • unique_ptr<list<Struct>> будет иметь накладные расходы при получении каких-либо членов

Оба храните данные на куче и unique_ptr<list<Struct>> немного меньше в стеке.

2

Высказывание unique_ptr<> - это как сказать *, но с дополнительным преимуществом автоматического удаления.

Разница между unique_ptr<list<Struct>> и list<unique_ptr<Struct>> точно так же, как разница между list<Struct>* и list<Struct*>. То есть, один является указателем на listStruct, а другой - list указателей на Struct. Это довольно очевидная разница.

Тип list управляет собственным содержимым, поскольку он выделяет память для узлов списка, которые хранят то, что вы положили в <>. Таким образом, узел в list<Struct> содержит объект Struct напрямую. Но узел в list<Struct*> содержит только указатель на структуру.

По логическому расширению узлы в list<unique_ptr<Struct>> удерживают unique_ptr<Struct>, что указывает на структуру, выделенную отдельно. Напротив, a unique_ptr<list<Struct>> является указателем на list, узлы которого расположены непосредственно Struct s.

Управление содержимым list нет, а не может обрабатывать указатель, который его обертывает. Это путаница в том, где выполняется управление: list управляет его содержимым - список - напрямую, а unique_ptr управляет его содержимым - необработанным указателем - напрямую, и ничего больше.

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