【问题标题】:Passing unique_ptr as reference parameter or const unique_ptr reference传递 unique_ptr 作为参考参数或 const unique_ptr 参考
【发布时间】:2019-12-28 01:56:35
【问题描述】:

我在std::vector<std::unique_ptr<MyObject>> 中维护了一些对象池,并将对象从该池传递给函数void process(...)。我不清楚将这些对象之一传递给process() 函数的最佳方式。如果我理解我读过的不同答案和文章,最好将其作为常规参考传递,如下所示: void process(MyObject& buffer);

据我了解,这更可取,因为:

  1. 应该保证我传入的缓冲区在 process() 方法的整个生命周期内都存在,因为它是由 unique_ptr 的所有者调用的,即调用方法
  2. 调用者也可以传递堆栈分配的对象,因此这不会对该方法的客户端施加分配限制
  3. 如果 ptrs 可以为 nullptr,则建议将原始指针传递给 process() 方法

这种理解是正确的还是最好的指导?以下是我读过的参考资料: Passing const unique_ptr reference as parameter

https://www.chromium.org/developers/smart-pointer-guidelines

https://herbsutter.com/2013/06/05/gotw-91-solution-smart-pointer-parameters/

【问题讨论】:

  • 我认为这种推理没有问题。
  • 听起来不错。我唯一的问题是为什么要存储unique_ptr 的数组而不是MyObject 本身。这似乎意味着向量可以包含 null,所以我会使用指针方法。
  • @CruzJean 你的意思是问我为什么不存储原始的MyObject* 指针?
  • @MikeSweeney 我的意思是为什么不std::vector<MyObject>。除非 MyObject 是多态的,否则它不应该是一个问题 - 只是删除一个间接级别。
  • @CruzJean 这是一种不可移动、不可复制的类型。它封装了一个原始内存缓冲区。据我了解,这意味着这行不通,但也许我错了。

标签: c++ c++11 smart-pointers


【解决方案1】:

是的,这是一个明智的方法,因为你给出的原因。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-03-31
    • 1970-01-01
    • 2014-03-05
    • 1970-01-01
    • 2011-12-15
    • 1970-01-01
    • 2010-12-12
    相关资源
    最近更新 更多