我正在使用大量接口来实现依赖注入(测试驱动开发)。出于这个原因,我的很多对象都是通过std :: shared_ptr指向的。我本来会使用std :: unique_ptr,但是当谷歌模拟它们时,它们根本没有复制构造函数。
我可以采取哪些措施来及早发现循环参考文件?
我正在使用谷歌测试在linux平台上工作。
答案 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
来破坏静态可识别的循环。