我知道有weak_ptr
来打破这个循环,但在发现问题后,这是一个修复。是否有可用于检测或避免循环引用的模式或工具?
答案 0 :(得分:4)
你可以通过设计避免这种情况。正如Stephan T. Lavavej在GoingNative2012会议上非常好地指出的那样(你可以在线查看视频),“所有权”是一个有向无环图,一个DAG。 DAG中没有循环。如果您的所有权图表不是DAG,那么您的设计是......有问题的,因为拥有B和B拥有A是没有意义的。但shared_ptr是一个“共享所有权指针”。持有这种指针的对象或范围拥有指针对象。尝试从所有权图表的角度思考。
对于每种情况,shared_ptr都不是正确的工具。它不应该允许你像你在Java中那样编写代码,在那里你不必考虑所有权(很多)。它应该提供自动和确定性的清理。如果需要“非拥有”指针,则weak_ptr或原始指针是合适的。只需确保原始指针指向的对象保持足够长的时间。
答案 1 :(得分:2)
显而易见的答案是不要将shared_ptr
用于对象
他们自己可能包含shared_ptr
。 shared_ptr
有点儿
特别的,应该谨慎使用。
答案 2 :(得分:1)
我强烈反对sellibitze所说的并重新思考这个设计。如果你真正拥有的是单向所有权而只是观察相反的方向,则考虑weak_ptr。这允许您检查一个对象是否处于活动状态,但是由于您有一个指向它的指针,因此不会使该对象保持活动状态。
答案 3 :(得分:0)
你可以实现一个类似于smart_ptr
的包装器,它在创建存储this
指针上(例如通过宏)。然后构建有向图,其中包含从this
到shared_ptr
包含的对象的边,并检测任何周期,例如通过拓扑排序。
我建议这只适用于使用密集shared_ptr
并且无法控制所有设计方面的大型代码库。对于其他情况,只需使用@sellibitze推荐。