【问题标题】:C++ Design: Passing pointer/reference to ref-counted objectC++ 设计:将指针/引用传递给引用计数的对象
【发布时间】:2013-01-08 03:06:46
【问题描述】:

我有一个有向无环图,由 Node 对象组成。每个节点都有一个std::shared_ptrs 到其他节点的列表,这些节点是它在图中的子节点。我需要很多有用的方法,例如插入/放置/重新设置节点,测试一个节点是否是另一个节点的祖先等。有些是标准的类似 STL 的方法,有些是特定于有向无环图和特定于我的需要。

问题是,当这样的方法接受一个节点作为参数时,它应该接受一个引用吗? weak_ptr?还是shared_ptr?我试图检查用例,但很难说。这里最好的设计是什么?我是智能指针的新手,我不确定什么是最佳选择。我应该将shared_ptr<Node> 视为节点对象的“表示”吗?或者选择的方式更复杂?

提前致谢

【问题讨论】:

    标签: c++ parameters c++11 shared-ptr


    【解决方案1】:

    仅在所有者集有意义地扩展时传递shared_ptr(按值)或复制它。在将节点作为纯信息处理时传递指针是安全且首选的。

    注意std::enable_shared_from_this 工具可以从任何图形对象中检索正确的std::shared_ptr。使用该基类,有效的裸指针和共享指针本质上是等价的。我不确定它增加了多少(如果有的话)开销。 (它肯定会确保不会出现额外的堆碎片,std::make_shared 也会这样做。)

    在任何地方传递shared_ptr 只是对shared_from_this 优雅提供的功能的优化。但是,当您这样做时,请通过 const 参考传递它们,因为它们只是提供信息而没有主动仲裁所有权。

    【讨论】:

    • 我明白了...我没有意识到弱 ptr 没有 operator->,所以传递它们是没有用的,因为在大多数情况下我必须先转换为共享 ptr方法
    猜你喜欢
    • 1970-01-01
    • 2015-10-30
    • 1970-01-01
    • 2019-09-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多