2

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

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

提前致谢

4

1 回答 1

2

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

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

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

于 2013-01-08T03:26:27.637 回答