gpt4 book ai didi

c++ - 理解带有循环引用的 Shared_ptr?

转载 作者:太空宇宙 更新时间:2023-11-03 17:25:46 27 4
gpt4 key购买 nike

我想了解 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<<"\nFunc::a_ptr_ use_count = "<<bptr->a_ptr_.use_count();
std::cout<<"\nFunc::b_ptr_ use_count = "<<aptr->b_ptr_.use_count();
}

int main()
{
std::shared_ptr<A> aptr = std::make_shared<A>();
std::cout<<"\nBefore func::a_ptr_ use_count = "<<aptr.use_count();
func(aptr);
std::cout<<"\nAfter func::a_ptr_ use_count = "<<aptr.use_count();
std::cout<<"\nAfter 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

但是我期待这个“在 func::a_ptr_ use_count = 1 之后”。在 bptr 超出 func() 的范围后,引用计数应该已经减少。我在这里缺少什么?

提到的重复问题没有解释引用计数是如何递增/递减的。我对如何完成(在 shared_ptr 中)的内部机制更感兴趣,这在所附的其他问题的答案中没有解释。

最佳答案

为什么引用计数应该减少? bptr 可能超出范围,但 bptr 只会影响您的 B 对象的引用计数。还有两个对 A 对象的引用:

  1. 共享指针仍在 main 范围内
  2. 存储在您的B对象中的共享指针

只要存在对您的A 对象的实时引用,您的B 对象就会继续存在,反之亦然(这是您通过循环共享引用有意触发的).要让你的 B 对象消失,你需要在引用循环中有一个引用是弱/原始的,并清除存储在你的 main 方法中的指针,这样就没有 top-水平引用持续存在。

关于c++ - 理解带有循环引用的 Shared_ptr?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44510669/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com