В реальном стандарте С++ создание коллекций, удовлетворяющих следующим правилам, сложно, если не невозможно:
- безопасность исключений,
- дешевые внутренние операции (в реальных контейнерах STL: операции - это копии),
- автоматическое управление памятью.
Чтобы удовлетворить (1), коллекция не может хранить исходные указатели. Чтобы удовлетворить (2), коллекция должна хранить необработанные указатели. Чтобы удовлетворить (3), коллекция должна хранить объекты по значению.
Заключение: три элемента конфликтуют друг с другом.
Элемент (2) не будет удовлетворен, если shared_ptr
используется, потому что, когда сборке нужно будет перемещать элемент, ему нужно будет сделать два вызова: конструктору и деструктору. Нет массивных, memcpy()
-подобных операций копирования/перемещения.
Правильно ли, что описанная проблема будет решена с помощью unique_ptr
и std::move()
? Коллекции, использующие инструменты, смогут удовлетворить все 3 условия:
- Когда коллекция будет удалена как побочный эффект исключения, она вызовет деструкторы
unique_ptr
. Нет утечки памяти. -
-
unique_ptr
не требуется дополнительное пространство для счетчика ссылок; поэтому его тело должно быть точно того же размера, что и обернутый указатель, - Я не уверен, но похоже, что это позволяет перемещать группы
unique_ptrs
с помощьюmemmove()
подобных операций (?), - даже если это невозможно, оператор
std::move()
позволяет перемещать каждый объектunique_ptr
, не создавая пары пары конструктор/деструктор.
-
-
unique_ptr
будет иметь эксклюзивное право владения данной памятью. Никаких случайных утечек памяти не будет.
Это правда? Каковы другие преимущества использования unique_ptr
?