Какая разница между unique_ptr<list<Struct>>
и list<unique_ptr<Struct>>
? Будет ли list<unique_ptr<Struct>>
привести к тому, что в памяти также будут автоматически управляться элементы?Контейнеры Unique_ptr или unique_ptr элементы
ответ
- Очевидная разница в том, что вы должны определить
list<unique_ptr<Struct>>
в точке строительства, в то время как при сооружатьunique_ptr<list<Struct>>
это может быть простоnullptr
list<unique_ptr<Struct>>
имеет незначительную нагрузку хранения все указателиunique_ptr<list<Struct>>
будет иметь накладные расходы при получении каких-либо членов
Оба храните данные на куче и unique_ptr<list<Struct>>
немного меньше в стеке.
Высказывание unique_ptr<>
- это как сказать *
, но с дополнительным преимуществом автоматического удаления.
Разница между unique_ptr<list<Struct>>
и list<unique_ptr<Struct>>
точно так же, как разница между list<Struct>*
и list<Struct*>
. То есть, один является указателем на list
Struct
, а другой - 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
управляет его содержимым - необработанным указателем - напрямую, и ничего больше.
- 1. Вложенные контейнеры unique_ptr и stl
- 2. error: объявлено здесь unique_ptr (const unique_ptr &) = delete;
- 3. Как отличить int unique_ptr в void unique_ptr?
- 4. Назначить производный класс unique_ptr базовому классу unique_ptr
- 5. shared_ptr или unique_ptr to CustomDialogEx
- 6. unique_ptr оператор =
- 7. unique_ptr установки
- 8. Переназначение unique_ptr
- 9. std :: перемещение std :: unique_ptr в stl контейнеры. (Проблема компилятора MSVC)
- 10. Дружественный API с unique_ptr
- 11. shared_ptr и unique_ptr за исключением
- 12. Память по умолчанию unique_ptr
- 13. std :: unique_ptr и шаблон
- 14. Передача unique_ptr vs raw_ptr?
- 15. Что такое unique_ptr?
- 16. Ошибки компилятора Unique_ptr
- 17. std :: unique_ptr ostream inserter
- 18. Когда shared_ptr, when unique_ptr
- 19. move semantics and unique_ptr
- 20. Альтернативы static_pointer_cast для unique_ptr
- 21. Переместить семантику с unique_ptr
- 22. Вектор unique_ptr члена
- 23. создание shared_ptr из unique_ptr
- 24. Передача unique_ptr в функции
- 25. Почему unique_ptr <T> :: ~ unique_ptr нуждается в определении T?
- 26. Добавить unique_ptr производного класса в вектор базового класса unique_ptr
- 27. Замена объекта unique_ptr в векторе с помощью Another unique_ptr
- 28. Изменение цели unique_ptr, а также инициализация const unique_ptr с ним
- 29. Scoped std :: unique_ptr cast
- 30. Объекты-члены как unique_ptr или на стеке
Первый - это указатель на список, второй - список указателей. Второй обычно используется в случае полиморфных объектов (является ли 'Struct' базовым классом?), Первое странно. – milleniumbug
Да, я понимаю эту часть. В основном меня беспокоит то, как распределение памяти работает в обоих случаях. Будет ли первый выделять элементы в стеке или куче? Второй из них довольно очевиден, элементы находятся в куче, информация управления списками находится в стеке. Как насчет первого? –
@SidharthMudgal: Оба будут выделять элементы в куче; вот что делают стандартные контейнеры. В первом случае сама структура списка также находится в куче, что является странным. Во втором, каждый элемент, выделенный в кучу, является указателем на дополнительный объект, выделенный для кучи. Если вам не нужна эта дополнительная косвенность по какой-либо причине (например, полиморфизм), она должна быть «list». Или, скорее, 'vector '. –