У меня (по ошибке) было следующее задание в моей программе:
std::shared_ptr<SI::Program> m_program; // in class
m_program = std::make_unique<SI::Program>(); // in method
Когда я нашел это, я сначала удивился, почему это даже компилируется. Оказывается shared_ptr
имеет специальный оператор назначения перемещения для unique_ptr
объекты.
Мой вопрос: всегда ли это безопасно, или это имеет какие-то последствия?
(Безопасно с точки зрения выполнения кода; очевидно, это небезопасно для проверки кода …)
Это «безопасно» сделать в том смысле, что у вас не будет никаких двойных удалений или других проблем.
Это не нормально, потому что:
make_unique
используется для создания уникальных указателей, а не общего доступа. make_unique
будет только выделять объект, а не связанный блок управления. это заставит shared_ptr
конструктор для выделения самого блока управления. std::make_shared
распределите их в одном распределении, что намного эффективнее. Да, это совершенно безопасно; shared_ptr
имеет конструктор, который может передать право собственности от unique_ptr
на ходу. Хотя это не так эффективно, как звонить make_shared
должным образом.