C++ 使用std::shared\u ptr检测循环引用
为了依赖注入(测试驱动开发),我使用了很多接口。因此,我的很多对象都是通过std::shared_ptr指向的。我会使用std::unique_ptr,但当谷歌模拟时,他们没有必要的复制构造函数 如果循环引用发生,我可以采取哪些措施来尽早发现循环引用C++ 使用std::shared\u ptr检测循环引用,c++,shared-ptr,std,googletest,googlemock,C++,Shared Ptr,Std,Googletest,Googlemock,为了依赖注入(测试驱动开发),我使用了很多接口。因此,我的很多对象都是通过std::shared_ptr指向的。我会使用std::unique_ptr,但当谷歌模拟时,他们没有必要的复制构造函数 如果循环引用发生,我可以采取哪些措施来尽早发现循环引用 我正在使用google test在linux平台上工作。如果你有一个同质对象图(即,节点->节点->节点…),你可以使用通常的循环检测算法 如果您的图形是异构的(Document->Element->Table->Document或其他什么),那么
我正在使用google test在linux平台上工作。如果你有一个同质对象图(即,
节点->节点->节点…
),你可以使用通常的循环检测算法
如果您的图形是异构的(Document->Element->Table->Document
或其他什么),那么遍历它可能太痛苦了。。。尽管使用聪明的自定义迭代器类型可能是可行的
在这种情况下,更常见的做法是构造所有权语义,这样就不会有循环,也许可以使用
弱\u ptr
来打破静态可识别的循环。不可能自动检测带有共享指针的循环引用,我用来检测循环引用的一种技术是以以下方式显式地进行检测。维护一个全局可访问的std::vector
,在所有的CTOR中将对象添加到该向量,然后在DTOR中将其删除。然后在main的末尾,你只需检查向量是否为空,如果不是,那么你可能在某个地方有一个循环引用,向量将帮助你跟踪哪里。如果您拥有静态分配对象所拥有的共享指针,则很容易出现误报,尤其是在静态初始化顺序失败的情况下
在boost中有define
boost\u SP\u ENABLE\u DEBUG\u HOOKS
,通过它可以在应用程序范围内对所有类型执行此操作。你不是说重载new和delete吗?重载也是一个选项,对吗?这也是一个选项,但由于放置了新的和自定义的分配器,所以不够健壮。在您的示例中,Document->Element->Table->Document,表和文档之间只需要弱ptr,对吗?如果一个元素有一个next()方法来获取指向其下一个同级的指针,该怎么办。那么应该使用什么类型的指针呢?如果有一个公共基和一个虚拟的next
方法,我会把它算作基类型FWIW的同质图。但一般来说,我建议限制shared_ptr
以表示所有权(比如,文档拥有其元素),而同级指针或父容器的反向指针将是弱(或原始)指针