将make_unique <X>分配给shared_ptr <X>

Fel*_*bek 4 c++ shared-ptr unique-ptr move-assignment-operator

我(错误地)在程序中进行了以下分配:

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

m_program = std::make_unique<SI::Program>(); // in method
Run Code Online (Sandbox Code Playgroud)

当我找到这个时,我首先想知道为什么它甚至可以编译。事实证明shared_ptrunique_ptr对象具有特殊的移动分配运算符。

我的问题是,这样做是否总是安全的,或者有任何含义?

(对于代码执行而言是安全的;对于代码审阅显然不安全...)

Nic*_*las 5

是的,这是完全安全的;shared_ptr有一个构造函数,可以unique_ptr通过移动转移所有权。虽然它不如make_shared正确调用那样有效。


Dav*_*aim 5

从某种意义上讲,您不会有任何重复删除或其他问题,这样做是“安全的”。

这样做是不可行的,因为:

  1. 这具有误导性- make_unique用于创建唯一的指针,而不是共享的。
  2. 这很浪费- make_unique仅分配对象,而不分配关联的控制块。这将迫使shared_ptr构造函数自行分配控制块。std::make_shared一次分配它们,效率更高得多。