当前位置: 首页 > news >正文

循环引用问题和专门用来解决的weak_ptr

#include <iostream>
#include <memory>



class A {
public:
    std::shared_ptr<A> p;
    ~A() { std::cout << "A's destructor\n"; }
};



int main() {
    std::shared_ptr<A> x = std::make_shared<A>();
    x->p=x;


    return 0;
}

A对象内的智能指针p是x拷贝构造的,所以控制块的强引用计数变为2

main结束后x析构,强引用计数减1,最后是1,无法执行A对象的析构,也无法执行控制块的析构

#include <iostream>
#include <memory>



class A {
public:
    std::weak_ptr<A> p;
    ~A() { std::cout << "A's destructor\n"; }
};



int main() {
    std::shared_ptr<A> x = std::make_shared<A>();
    x->p=x;


    return 0;
}

用weak_ptr来解决这个问题,拷贝构造后,控制块的强引用计数还是1,弱引用计数为1

当main结束后,x析构,强引用计数为0,然后A对象析构,执行完函数体后成员p析构,弱引用计数为0,然后控制块析构,不会内存泄漏

http://www.dtcms.com/a/111821.html

相关文章:

  • 第二十八章:Python可视化图表扩展-和弦图、旭日图、六边形箱图、桑基图和主题流图
  • 算法设计学习8
  • 从零构建大语言模型全栈开发指南:第五部分:行业应用与前沿探索-5.2.3前沿方向:MoE架构、世界模型与具身智能
  • html5炫酷3D文字效果项目开发实践
  • Flink 1.20 Kafka Connector:新旧 API 深度解析与迁移指南
  • 泰博云平台solr接口存在SSRF漏洞
  • Docker安装、配置Mysql5.7
  • hackmyvm-Principle
  • Java 大视界 -- 基于 Java 的大数据机器学习模型在图像识别中的迁移学习与模型优化(173)
  • 软路由安装指南
  • MySQL体系架构
  • leetcode数组-移除元素
  • 基于RDK X3的“校史通“机器人:SLAM导航+智能交互,让校史馆活起来!
  • SpringKafka消息消费:@KafkaListener与消费组配置
  • 大模型如何优化数字人的实时交互与情感表达
  • 【小沐杂货铺】基于Three.JS绘制三维数字地球Earth(GIS 、WebGL、vue、react)
  • Oracle SQL 执行计划分析与优化指南
  • autoconf 笔记250404
  • 原始字符串字面量(Raw String Literal)
  • Qt 中 findChild和findChildren绑定自定义控件
  • leetcode-代码随想录-链表-移除链表元素
  • Docker安装、配置Nacos
  • 网络安全基础知识总结
  • RabbitMQ高级特性2
  • MINIQMT学习课程Day6
  • React项目在ts文件中使用router实现跳转
  • 搜索与图论 树的广度优先遍历 图中点的层次
  • MusicMint ,AI音乐生成工具
  • bun 版本管理工具 bum 安装与使用
  • oracle账户被锁定了应该怎么办