C++设计: Passing pointer/reference to ref-counted object

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

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

问题是,当这样的方法采用节点作为参数时,是否应该采用引用?的weak_ptr ?或shared_ptr ?我尝试检查用例,但很难说。这里最好的设计是什么?我是智能指针的新手,我不确定什么是最好的选择。我应该治疗shared_ptr<Node>作为节点对象的“表示”?或者也许选择的方式更加复杂?

提前致谢

最佳答案

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

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

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

关于C++设计: Passing pointer/reference to ref-counted object,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14207622/

相关文章:

c++ - 使用 boost::phoenix 适配 BOOST_CHECK 宏

c++ - std::array 和 lambda

c++ - 从 std::cin 读取密码

c++ - 后缀运算符重载中虚拟参数的用途? C++

c++ - std::atomic 变量的比较操作线程安全吗?

go - 如何在收到参数后安全关闭 golang 服务 - 最佳实践

SQL 报告服务,参数值更新未显示

c# - C# 中的反射不适用于 COM(和 C++)

c++ - 如何知道我是否创建了贪心算法?

c++ - 这个 C++ 语句是什么意思?