c++设计:传递指针/引用到重新计数的对象

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

本文关键字:新计数 对象 引用 设计 指针 c++      更新时间:2023-10-16

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

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

Thanks in advance

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

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

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