代码之家  ›  专栏  ›  技术社区  ›  mafu

立即取消引用唯一指针

  •  -2
  • mafu  · 技术社区  · 7 年前

    我不太熟悉现代C++,希望能更好地理解下面的片段:

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

    我看到一个 unique_ptr 是从对 State 。这应该使用 状态 创建的新实例 状态 ,并将指向此新实例的指针包装在 currstate .

    当前状态 然后作为函数的参数立即取消引用。 当前状态 之后才使用,但在调用完成之前不会超出范围,因此它及其链接 状态 不要过早被破坏。

    对于调用,在 唯一指针 使用。取决于 do_something 采用 状态 State& ,是否重新复制。

    是这样吗?如果是这样,是否正确 唯一指针 仅用于创建 m_rootstate 不用担心内存管理?

    2 回复  |  直到 7 年前
        1
  •  6
  •   darune    7 年前
    State & m_rootstate; 
    

    这本身就没有意义——我猜你把重要的东西都忘了。必须初始化引用。

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

    这构造了一个新的 State 把它包起来 unique_ptr (在本例中,通过复制构造函数,所以您是对的,它是一个副本)

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

    根据某个操作处于状态还是状态,它将再次被复制。 真的。

    如果是这样,唯一指针的目的仅仅是创建m_rootstate的副本,而不必担心内存管理,这是正确的吗?

    在这种情况下,似乎没有必要创建 唯一指针 首先。 您也可以这样创建一个直接堆栈副本:

    State currstate(m_rootstate);
    
        2
  •  1
  •   eerorika    7 年前

    是这样吗?

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

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


    如果是这样,是否正确 unique_ptr 仅用于创建 m_rootstate 不用担心内存管理?

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

    请注意,所示的摘录没有显示 为什么 是否 完全需要动态分配。它也没有透露 为什么 是否 需要一份复印件。也许这些东西是需要的。然而,这些事情应该在不需要的时候避免。