我有一个有向的非循环图,由Node对象组成。每个节点都有一个std::shared_ptr
到其他节点的列表,这些节点是图中的子节点。我有许多我需要的有用方法,例如插入/放置/重新定位节点,测试节点是否是另一个节点的祖先等等。有些是标准的类似STL的方法,有些是特定于有向非循环图并且特定于我的需要。
问题是,当这样的方法将节点作为参数时,是否需要引用?一个weak_ptr
?还是shared_ptr
?我试图检查用例,但很难说。什么是最好的设计?我是智能指针的新手,我不确定什么是最好的选择。我应该将shared_ptr<Node>
视为节点对象的“表示”吗?或者选择的方式更复杂?
提前致谢
答案 0 :(得分:2)
仅传递shared_ptr
(按值)或在有意义地扩展所有者集时复制它。在将节点作为纯信息处理时传递指针是安全的,也是首选。
请注意std::enable_shared_from_this
工具从任何图表对象中检索正确的std::shared_ptr
。使用该基类,有效的裸指针和共享指针基本上是等效的。我不确定它增加了多少(如果有的话)开销。 (它肯定会确保不存在额外的堆碎片,std::make_shared
也会这样做。)
将shared_ptr
传递到任何地方只是shared_from_this
优雅提供的功能优化。但是当你这样做时,请通过const
引用传递它们,因为它们只是在没有主动仲裁所有权的情况下提供信息。