我正在使用许多接口(interface)来进行依赖关系注入(inject)(测试驱动开发)。因此,我的很多对象都是通过std::shared_ptr指向的。我本来会用std::unique_ptr的,但当谷歌模拟时,它们没有所需的副本构造函数。
我应该采取什么措施来尽早发现圆形参照物?
我正在使用google test在Linux平台上工作。
最佳答案
用共享指针自动检测循环引用是不可能的,我用来检测循环引用的一种技术是以以下方式显式地进行检测。维护全局可访问的std::vector< T* >
,在所有ctor中将对象添加到 vector 中,然后在dtor中将其删除。然后在main的最后检查一下 vector 是否为空,如果不是,那么您可能在某处有一个循环引用, vector 将帮助您查找位置。如果您拥有静态分配的对象拥有的共享指针,则很容易遇到误报,尤其是当静态初始化顺序适用于惨败时。
在boost中,有一个定义的BOOST_SP_ENABLE_DEBUG_HOOKS
,通过它可以针对所有类型在整个应用程序中使用。