5

我(错误地)在我的程序中有以下任务:

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

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

当我发现这个时,我首先想知道为什么它甚至可以编译。事实证明,对象shared_ptr有一个特殊的移动赋值运算符unique_ptr

我的问题是,这样做是否总是安全的,还是有任何影响?

(代码执行安全;代码审查显然不安全......)

4

2 回答 2

7

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

这样做是不行的,因为:

  1. 它具有误导性 -make_unique用于制作唯一指针,而不是共享。
  2. 这是浪费 -make_unique只会分配对象,而不是关联的控制块。这将强制shared_ptr构造函数自己分配控制块。std::make_shared将它们都分配到一个分配中,这样效率更高。
于 2016-08-18T15:29:14.343 回答
5

是的,那是绝对安全的;shared_ptr有一个构造函数,可以通过移动从 a 转移所有权unique_ptr。尽管它不如make_shared正确调用有效。

于 2016-08-18T15:28:04.117 回答