c++设计:传递指针/引用到重新计数的对象
C++ Design: Passing pointer/reference to ref-counted object
我有一个由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
引用传递它们,因为它们只是提供信息而没有主动仲裁所有权。
相关文章:
- Constexpr替代了新的放置方式,可以让内存中的对象保持未初始化状态
- 当一个新对象被分配到它的地址时,对象是否必须被销毁
- C++ 如何在将新对象分配给另一个对象时创建新对象
- 是什么让放置新调用对象的构造函数?
- 放置派生C++的新基子对象
- 哪种数据结构是在一个向量中搜索和计数对象对的最佳数据结构
- 使用矢量中的现有对象,如果C++中不存在,则创建新的对象
- 将新对象shared_pt分配给 A[1],则 A[1] 中包含的原始对象的引用计数减少.如何
- 如何删除分配了新的对象
- C 将HEAP对象插入std ::用insert()插入映射,而另一个则存在删除新的对象
- 使用新的对象
- 使用C++0x std::thread调用新ed对象中的成员函数
- 新的新类对象的函数;错误:非静态成员引用必须相对于特定对象
- C++ 没有新返回对象的算术运算符
- 如何在每次迭代中创建一个新变量/对象的循环
- 如何在Cython中返回新的c++对象
- 如何在不'new'的情况下将新的对象实例添加到 std::list
- boost::make_shared在哪里为底层对象和引用计数对象分配内存大小
- 使用“放置新”转移对象所有权
- 将两个复杂的属性重新组合成新的对象