c++ - C++中引用计数和循环引用的概念
问题描述
我知道如何weak_ptr
使用,我阅读了以下帖子:
关于“循环引用”,我使用了weak_ptr,但仍然发生内存泄漏
但是有一个概念我还不能理解。
我将根据我的理解演示shared_ptr
创建和发布:
1.shared_ptr
pa
创建
reference_count
的pa
应该是0
。因为没有shared_ptr
分到pa
。
{/*scope 1*/
shared_ptr<int> pa;
// reference_count_pa = 0
}
2.我在另一个范围内分配新shared_ptr<int>
pb
的pa
{/*scope 1*/
shared_ptr<int> pa;
{/*scope 2*/
shared_ptr<int> pb = pa;
// reference_count_pa = 1
// reference_count_pb = 0
}
}
reference_count
ofpa
应该是1
因为shared_ptr
pb
指向pa
.
reference_count
的pb
应该是0
因为没有shared_ptr
分到pb
。
3. 现在,一个简单的Circular Reference
:
正如关于“循环引用”中所展示的,我使用了weak_ptr,但内存泄漏仍然发生:
{/*scope 1*/
shared_ptr<int> pa;
{/*scope 2*/
shared_ptr<int> pb = pa;
pa = pb; //circular reference
// reference_count_pa = 1
// reference_count_pb = 1
}
}
reference_count
ofpa
应该是1
因为shared_ptr
pb
指向pa
reference_count
ofpb
应该是1
因为shared_ptr
pa
指向pb
4. 结束时scope 2
pb
被删除,因为程序走出scope 2
.
reference_count
ofpa
是0
现在,因为没有shared_ptr
指向pa
.
reference_count
的pb
还在1
。
5. 结束时scope 1
reference_count
的pb
是0
现在因为没有shared_ptr
点到pb
。
上述步骤是我理解的reference_count。
pa
并被pb
正常删除。
我很困惑。
谁能纠正我在上述步骤中的错误?
谢谢!
解决方案
有人纠正我在上述步骤中的错误吗?
首先,这不是循环引用。其次,您的代码中没有任何引用计数,因为您无需int
计算引用。
循环引用的形式为
struct Node {
std::shared_ptr<Node> next;
};
int main() {
std::shared_ptr<Node> a = std::make_shared<Node>();
std::shared_ptr<Node> b = std::make_shared<Node>();
a->next = b;
b->next = a;
}
推荐阅读
- qt - 我的自定义小部件未显示在 Qt Creator / Qt Designer 中,但在我执行程序时显示
- android - 找不到参数的方法 firebaseAppDistribution()
- spring-boot - 无法判断 Hystrix 电路是否用千分尺强制打开
- python - Python 替换外部 SQL 查询中的引用值
- javascript - 更新时调用了两次 Sequelize afterValidate 钩子
- c# - 如何在 SerialPort 类 C# 中检测串行位字节错误
- azure - 微软 Azure DNS 缓存
- git - github - 如何将提交转移到来自同一分支的另一个拉取请求
- .net - Reference Assemblies 和 Windows Framework 目录中不同版本的 System.Net.Http
- powershell - 带过滤器的 Get-ChildItem 返回匹配但包含一些不匹配的文件