【问题标题】:What is the correct syntax for std::vector<std::unique_ptr<>>::push_back()? [closed]std::vector<std::unique_ptr<>>::push_back() 的正确语法是什么? [关闭]
【发布时间】:2020-03-02 16:02:12
【问题描述】:

我已经读过,如果我想使用来自std::vector&lt;std::unique_ptr&lt;T&gt;&gt;push_back,我需要为unique_ptr 定义一个删除器。真的吗?如果是,那么正确的语法是什么?

感谢您的回答

【问题讨论】:

  • 1.您是否尝试过推回唯一指针? 2.你考虑过std::emplace_back吗?
  • 它的工作方式与其他所有push_back 完全相同。我不知道为什么需要自定义删除器。我建议您发布失败的代码。然后我们可以解释什么是错的。
  • 这是真的吗?没有。现场演示:godbolt.org/z/tVHB-5.
  • 你可以做vector.push_back(std::move(ptr))

标签: c++ c++11 std stdvector unique-ptr


【解决方案1】:

不,在正常情况下您不需要自定义删除器。对于现有的unique_ptr

vector.push_back(std::move(ptr));

工作正常(将指针的所有权转移到vector);对于新指针:

vector.push_back(std::make_unique<MyType>(args, go, here));

是最安全的(因为它确保指针始终受到管理,即使push_back 抛出异常),具有:

vector.emplace_back(new MyType(args, go, here));

如果vector 引发异常(例如,由于尝试扩展底层存储失败;尽管在这种情况下,您的程序可能无论如何都注定要失败,但可能会导致内存泄漏,但可能会更快一点,因此它可能不值得防御)。

【讨论】:

    【解决方案2】:

    如果默认的删除器不适合你的需要,你只需要编写删除器,所以对于特定的资源。

    push_back 用于可移动不可复制类型的语法是:

    std::vector<std::unique_ptr<T>> vs;
    
    vs.push_back(std::make_unique<T>(42));
    
    std::unique_ptr<T> p = std::make_unique<T>(42);
    vs.push_back(std::move(p));
    

    【讨论】:

      猜你喜欢
      • 2013-01-07
      • 2013-10-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-01-15
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      相关资源
      最近更新 更多