立即取消引用unique_ptr

Immediately dereferencing unique_ptr

本文关键字:ptr unique 引用 取消      更新时间:2023-10-16

我对现代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中的值。根据do_somethingState还是State&,它将被再次复制或不复制。

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

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采用状态还是状态&,它将再次复制或不复制。真。

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

在这种情况下,似乎没有必要首先创建unique_ptr。 您不妨像这样创建一个直接堆栈副本:

State currstate(m_rootstate);

这是对的吗?

你的描述是准确的,是的。

如果你的意思是问程序是否定义良好:忽略开头的未初始化引用,没有显示格式错误或具有未定义行为的代码。也就是说,您没有显示完整的程序,因此我们无法知道完整的程序是否正确。


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

正确。负责动态分配的内存管理确实是唯一指针类的目的。 (或者更一般地说,负责释放资源(。

请注意,显示的摘录根本没有揭示为什么或是否需要动态分配。它也没有透露为什么是否需要副本。也许这些东西是需要的。但是,只要不需要这些事情,就应该避免。