Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用std::shared\u ptr检测循环引用_C++_Shared Ptr_Std_Googletest_Googlemock - Fatal编程技术网

C++ 使用std::shared\u 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或其他什么),那么

为了依赖注入(测试驱动开发),我使用了很多接口。因此,我的很多对象都是通过std::shared_ptr指向的。我会使用std::unique_ptr,但当谷歌模拟时,他们没有必要的复制构造函数

如果循环引用发生,我可以采取哪些措施来尽早发现循环引用


我正在使用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
以表示所有权(比如,文档拥有其元素),而同级指针或父容器的反向指针将是弱(或原始)指针