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