3

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

4

4 回答 4

6

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

shared_ptr 并非适用于所有情况。它不应该允许您像在 Java 中那样编写代码,而不必考虑所有权(很多)。它应该提供自动和确定性的清理。如果您需要“非拥有”指针,weak_ptr 或原始指针是合适的。只需确保原始指针指向的对象能够存活足够长的时间。

于 2012-02-22T10:36:00.020 回答
2

显而易见的答案是不要使用shared_ptr本身可能包含shared_ptr. shared_ptr有点特殊,应该谨慎使用。

于 2012-02-22T10:32:09.903 回答
1

我会强烈呼应sellebitze所说的并重新考虑设计。如果您真正拥有的是单向所有权并且只是在相反方向上观察,请考虑使用weak_ptr。这使您可以检查对象是否处于活动状态,但不会仅仅因为您有指向它的指针而使该对象保持活动状态。

于 2012-02-22T10:42:34.507 回答
0

您可以实现一个,类似于smart_ptr在创建时存储this指针的包装器(例如通过宏)。然后构建具有从存储this到包含的对象的边的有向图,shared_ptr并检测任何循环,例如通过拓扑排序。

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

于 2012-02-22T10:57:30.910 回答