如何使用std :: shared_ptr检测或避免循环引用?

时间:2012-02-22 10:13:24

标签: c++ design-patterns smart-pointers cyclic-reference

我知道有weak_ptr来打破这个循环,但在发现问题后,这是一个修复。是否有可用于检测或避免循环引用的模式或工具?

4 个答案:

答案 0 :(得分:4)

你可以通过设计避免这种情况。正如Stephan T. Lavavej在GoingNative2012会议上非常好地指出的那样(你可以在线查看视频),“所有权”是一个有向无环图,一个DAG。 DAG中没有循环。如果您的所有权图表不是DAG,那么您的设计是......有问题的,因为拥有B和B拥有A是没有意义的。但shared_ptr是一个“共享所有权指针”。持有这种指针的对象或范围拥有指针对象。尝试从所有权图表的角度思考。

对于每种情况,

shared_ptr都不是正确的工具。它不应该允许你像你在Java中那样编写代码,在那里你不必考虑所有权(很多)。它应该提供自动和确定性的清理。如果需要“非拥有”指针,则weak_ptr或原始指针是合适的。只需确保原始指针指向的对象保持足够长的时间。

答案 1 :(得分:2)

显而易见的答案是不要将shared_ptr用于对象 他们自己可能包含shared_ptrshared_ptr有点儿 特别的,应该谨慎使用。

答案 2 :(得分:1)

我强烈反对sellibitze所说的并重新思考这个设计。如果你真正拥有的是单向所有权而只是观察相反的方向,则考虑weak_ptr。这允许您检查一个对象是否处于活动状态,但是由于您有一个指向它的指针,因此不会使该对象保持活动状态。

答案 3 :(得分:0)

你可以实现一个类似于smart_ptr的包装器,它在创建存储this指针上(例如通过宏)。然后构建有向图,其中包含从thisshared_ptr包含的对象的边,并检测任何周期,例如通过拓扑排序。

我建议这只适用于使用密集shared_ptr并且无法控制所有设计方面的大型代码库。对于其他情况,只需使用@sellibitze推荐。