使用std :: shared_ptr检测循环引用

时间:2012-07-12 09:05:15

标签: c++ shared-ptr std googletest googlemock

我正在使用大量接口来实现依赖注入(测试驱动开发)。出于这个原因,我的很多对象都是通过std :: shared_ptr指向的。我本来会使用std :: unique_ptr,但是当谷歌模拟它们时,它们根本没有复制构造函数。

我可以采取哪些措施来及早发现循环参考文件?

我正在使用谷歌测试在linux平台上工作。

2 个答案:

答案 0 :(得分:5)

使用共享指针自动检测循环引用是不可能的,我用来检测循环引用的一种技术是以下面的方式显式地执行它。维护一个全局可访问的std::vector< T* >,在所有ctors中将对象添加到向量中,然后在dtors中将其删除。然后在main的末尾你只需要检查向量是否为空,如果不是那么你可能在某处有一个循环引用,向量将帮助你追踪到哪里。如果您拥有由静态分配的对象拥有的共享指针,则很容易遇到误报,尤其是在应用静态初始化顺序失败时。

在boost中有定义BOOST_SP_ENABLE_DEBUG_HOOKS,通过它可以为所有类型执行此应用程序。

答案 1 :(得分:1)

如果你有一个同质对象的图形(即Node -> Node -> Node ...),你可以使用通常的循环检测算法。

如果你的图是异质的(Document -> Element -> Table -> Document或其他),遍历它可能太痛苦了......虽然可能有一个聪明的自定义迭代器类型。

在这种情况下,更常见的是构建所有权语义,因此不存在循环,可能使用weak_ptr来破坏静态可识别的循环。