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