C ++设计:将指针/引用传递给ref-counting对象

时间:2013-01-08 03:06:46

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

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

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

提前致谢

1 个答案:

答案 0 :(得分:2)

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

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

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