立即取消引用unique_ptr

时间:2018-09-24 10:33:23

标签: c++ unique-ptr

我对现代C ++不太熟悉,想更好地理解以下片段:

State & m_rootstate;
//...
auto currstate = std::make_unique<State> (m_rootstate);
do_something (*currstate);
// currstate is not used anywhere else

我看到unique_ptr是通过引用State创建的。这应该使用State的副本ctor来创建State的新实例,并将指向该新实例的指针包装在currstate中。

然后立即将

currstate作为函数的参数取消引用。之后不会使用currstate,但是直到调用结束后它才不会超出范围,因此它及其链接的State不会过早地被破坏。

对于该呼叫,使用unique_ptr内部的值。根据{{​​1}}是否使用do_somethingState,将再次复制它。

这是对的吗?如果是这样,State&的目的仅是创建unique_ptr的副本而不必担心内存管理是正确的吗?

2 个答案:

答案 0 :(得分:6)

State & m_rootstate; 

这本身没有任何意义-我猜您遗漏了重要的内容。引用必须初始化。

//...
auto currstate = std::make_unique<State> (m_rootstate);

这将构造一个新的State并将其包装在unique_ptr中(在这种情况下是通过复制构造函数,因此您是对的,它是一个副本)

do_something (*currstate);
// currstate is not used anywhere else

取决于do_something是否接受State或State&,它将再次复制。正确。

如果是这样,那么unique_ptr的目的仅仅是创建m_rootstate的副本而不必担心内存管理是否正确?

在这种情况下,似乎不必首先创建unique_ptr。 您最好也可以像这样创建直接堆栈副本:

State currstate(m_rootstate);

答案 1 :(得分:1)

  

这对吗?

您的描述正确,是的。

如果要询问程序是否定义正确:在一开始就忽略未初始化的引用,则没有显示代码格式错误或行为不确定。也就是说,您没有显示完整的程序,所以我们不知道完整的程序是否正确。


  

如果是这样,unique_ptr的目的仅是创建m_rootstate的副本而不必担心内存管理是否正确?

正确。照顾动态分配的内存管理确实是唯一指针类的目的。 (或更笼统地说,要注意释放资源)。

请注意,显示的摘录根本没有揭示为什么是否需要动态分配。它还不会显示为什么是否需要副本。也许这些东西是必需的。但是,在不需要它们时应避免使用这些东西。