【问题标题】:Can I push a smart pointer to a list of smart pointers?我可以将智能指针推送到智能指针列表吗?
【发布时间】:2019-01-27 12:20:24
【问题描述】:

我有以下代码:

class MarchingEvent
{
...
};

typedef std::list< std::shared_ptr<MarchingEvent> > Segment;

我能做到吗:

void myFunction(std::shared_ptr<MarchingEvent> A)
{
    Segment segment;
    segment.push_back( A ); // <- Questionable line.
}

A 推送到 segment 时,我的智能指针会正确递增吗?

【问题讨论】:

  • 如果您将std::shared_ptr 视为所有权 的一种形式,那么通过添加指向列表的指针,您现在已经添加了MarchingEvent 的所有者。
  • 在不相关的注释中,“默认”容器应该几乎总是std::vector。只有当您有特殊要求时,您才应该使用其他容器或容器适配器。
  • @πάντα ῥεῖ:非常感谢!是的,智能指针在推送到列表时得到了正确处理。
  • “将 A 推入分段时,我的智能指针会正确递增吗?” 是什么让您怀疑它能否正常工作?

标签: c++ c++11 stl std shared-ptr


【解决方案1】:

将 A 推入分段时,我的智能指针会正确递增吗?

是的。这就是std::shared_ptr 应该做的事情。

但请注意,如果在调用 push_back 后不使用对象 A,则可能需要将最后一行更改为

segment.push_back(std::move(A));

移动构造 segment 中的元素而不是复制它 - 复制在函数入口时已经完成,因为 A 是按值传递的。

【讨论】:

  • 知道我的数据是一个指针,这个移动并没有什么帮助,是吗?
  • 不,性能损失不是来自被复制而不是移动构造的指针,而是来自std::share_ptr 的控制块。智能指针的这一部分移动起来更便宜。
猜你喜欢
  • 2017-04-29
  • 1970-01-01
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2021-11-28
  • 2020-07-10
  • 1970-01-01
  • 2012-07-02
相关资源
最近更新 更多