Understanding Shared_ptr with cyclic references?(了解具有循环引用的SHARED_PTR?)
本文介绍了了解具有循环引用的SHARED_PTR?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我想了解SHARED_PTR如何递增或递减引用计数?
#include <iostream>
#include <memory>
class B;
class A
{
public:
std::shared_ptr<B> b_ptr_;
};
class B
{
public:
std::shared_ptr<A> a_ptr_;
};
void func(std::shared_ptr<A> &aptr)
{
std::shared_ptr<B> bptr = std::make_shared<B>(); //Creating shared pointer
bptr->a_ptr_ = aptr; // Creating cyclic dependency
aptr->b_ptr_ = bptr;
std::cout<<"
Func::a_ptr_ use_count = "<<bptr->a_ptr_.use_count();
std::cout<<"
Func::b_ptr_ use_count = "<<aptr->b_ptr_.use_count();
}
int main()
{
std::shared_ptr<A> aptr = std::make_shared<A>();
std::cout<<"
Before func::a_ptr_ use_count = "<<aptr.use_count();
func(aptr);
std::cout<<"
After func::a_ptr_ use_count = "<<aptr.use_count();
std::cout<<"
After func::b_ptr_ use_count = "<<aptr->b_ptr_.use_count();
return 0;
}
Output:
This is the output I see:
Before func::a_ptr_ use_count = 1
Func::a_ptr_ use_count = 2
Func::b_ptr_ use_count = 2
After func::a_ptr_ use_count = 2
After func::b_ptr_ use_count = 1
然而,我预料到这是"After Func::A_PTR_USE_COUNT=1"。在bptr超出func()的作用域之后,引用计数应该会递减。
我在这里错过了什么?
提到的重复问题没有解释如何递增/递减引用计数。我更感兴趣的是如何做到这一点的内部机制(在Shared_ptr中),这在附加的另一个问题的答案中没有解释。
推荐答案
为什么应该减少引用计数?bptr可能超出范围,但bptr只影响B对象的引用计数。仍然有两个对A对象的引用:
- 共享指针仍在
main中的作用域 B对象中存储的共享指针
A对象的活动引用,B对象就会继续存在,反之亦然(这是您通过循环共享引用故意触发的)。若要使B对象消失,您需要在引用循环中有一个引用是弱/原始的,并清除main方法中存储的指针,这样顶级引用就不会持续存在。
这篇关于了解具有循环引用的SHARED_PTR?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
沃梦达教程
本文标题为:了解具有循环引用的SHARED_PTR?
基础教程推荐
猜你喜欢
- C++结构和函数声明。为什么它不能编译? 2022-11-07
- 如何在 C++ 中初始化静态常量成员? 2022-01-01
- 如何检查GTK+3.0中的小部件类型? 2022-11-30
- 在 C++ 中计算滚动/移动平均值 2021-01-01
- 如何将 std::pair 的排序 std::list 转换为 std::map 2022-01-01
- 我有静态或动态 boost 库吗? 2021-01-01
- 静态库、静态链接动态库和动态链接动态库的 .lib 文件里面是什么? 2021-01-01
- 如何通过C程序打开命令提示符Cmd 2022-12-09
- 常量变量在标题中不起作用 2021-01-01
- 这个宏可以转换成函数吗? 2022-01-01
