我对现代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_something
或State
,将再次复制它。
这是对的吗?如果是这样,State&
的目的仅是创建unique_ptr
的副本而不必担心内存管理是正确的吗?
答案 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
的副本而不必担心内存管理是否正确?
正确。照顾动态分配的内存管理确实是唯一指针类的目的。 (或更笼统地说,要注意释放资源)。
请注意,显示的摘录根本没有揭示为什么或是否需要动态分配。它还不会显示为什么或是否需要副本。也许这些东西是必需的。但是,在不需要它们时应避免使用这些东西。