【发布时间】:2019-12-28 01:56:35
【问题描述】:
我在std::vector<std::unique_ptr<MyObject>> 中维护了一些对象池,并将对象从该池传递给函数void process(...)。我不清楚将这些对象之一传递给process() 函数的最佳方式。如果我理解我读过的不同答案和文章,最好将其作为常规参考传递,如下所示:
void process(MyObject& buffer);
据我了解,这更可取,因为:
- 应该保证我传入的缓冲区在
process()方法的整个生命周期内都存在,因为它是由 unique_ptr 的所有者调用的,即调用方法 - 调用者也可以传递堆栈分配的对象,因此这不会对该方法的客户端施加分配限制
- 如果 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