Назначение make_unique & lt; X & gt; на shared_ptr & lt; X & gt;

У меня (по ошибке) было следующее задание в моей программе:

std::shared_ptr<SI::Program> m_program; // in class

m_program = std::make_unique<SI::Program>(); // in method

Когда я нашел это, я сначала удивился, почему это даже компилируется. Оказывается shared_ptr имеет специальный оператор назначения перемещения для unique_ptr объекты.

Мой вопрос: всегда ли это безопасно, или это имеет какие-то последствия?

(Безопасно с точки зрения выполнения кода; очевидно, это небезопасно для проверки кода …)

3

Решение

Это «безопасно» сделать в том смысле, что у вас не будет никаких двойных удалений или других проблем.

Это не нормально, потому что:

  1. Это вводит в заблуждение — make_unique используется для создания уникальных указателей, а не общего доступа.
  2. Это расточительно — make_unique будет только выделять объект, а не связанный блок управления. это заставит shared_ptr конструктор для выделения самого блока управления. std::make_shared распределите их в одном распределении, что намного эффективнее.
2

Другие решения

Да, это совершенно безопасно; shared_ptr имеет конструктор, который может передать право собственности от unique_ptr на ходу. Хотя это не так эффективно, как звонить make_shared должным образом.

3

По вопросам рекламы [email protected]