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

为什么需要weak_ptr

当两个对象相互引用并且使用 shared_ptr 来管理资源时,会导致循环引用的问题。下面是一个简单的示例,演示了没有使用 weak_ptr 时的循环引用:
#include <iostream>
#include <memory>

class B; // 前置声明

class A {
public:
    std::shared_ptr<B> b_ptr; // A 拥有一个指向 B 的 shared_ptr

    A() {
        std::cout << "A constructor" << std::endl;
    }

    ~A() {
        std::cout << "A destructor" << std::endl;
    }
};

class B {
public:
    std::shared_ptr<A> a_ptr; // B 拥有一个指向 A 的 shared_ptr

    B() {
        std::cout << "B constructor" << std::endl;
    }

    ~B() {
        std::cout << "B destructor" << std::endl;
    }
};

 

int main() {

    std::shared_ptr a = std::make_shared();

    std::shared_ptr b = std::make_shared();

a->b_ptr = b; // A 持有 B 的 shared_ptr

b->a_ptr = a; // B 持有 A 的 shared_ptr

// 在这里,释放 a 和 b 的 shared_ptr 引用

a.reset();

b.reset(); // 当 a 和 b 的引用计数都降为 0 时,会导致内存泄漏,因为它们相互引用导致引用计数永远无法降为 0

return 0;

}

在这个示例中,类 A 和 B 相互引用并且使用 shared_ptr 来管理资源。当 a 和 b 的引用计数都降为 0 时,并不会释放资源,因为它们相互引用导致引用计数永远无法降为 0,从而导致内存泄漏。这种情况就是循环引用问题。


http://www.mrgr.cn/news/58838.html

相关文章:

  • 图为大模型一体机新探索,赋能智能家居行业
  • 云原生笔记
  • 220.存在重复元素③
  • springboot3.x使用@NacosValue无法获取配置信息问题解决
  • Python学习路线:从新手到专家
  • Linux可分配内存和空闲内存
  • Debezium日常分享系列之:使用Debezium检测数据变异模式
  • 【C/C++ Qt shared_ptr | make_shared | QSharedPointer 】绕圈圈
  • vue3学习(一)项目搭建
  • Depcheck——专门用于检测 JavaScript 和 Node.js 项目中未使用依赖项的工具
  • 自然语言处理实战:《七剑下天山》文本分析
  • Github关于LLM热门项目(10k+)
  • WebForms DataList 控件深入解析
  • Matlab数字信号处理——基于改进小波变换的图像去噪方法(7种去噪算法)
  • 【C++】抱C++中的函数式编程:使用`std::function`和Lambda表达式简化代码
  • Next.js + Prisma + Auth.js 实现完整的认证方案
  • 一篇文章告诉你什么是BloomFilter
  • 【网络安全初识】——互联网发展史
  • 数据治理与主数据管理:现代企业数据管理的核心
  • 【软件工程】软件工程入门
  • 整合Mybatis-plus及最佳实践
  • 聊聊Web3D 发展趋势
  • app头部氛围该如何设计,这里有50个示例
  • GLM-4-Voice:智谱AI的端到端中英语音对话模型
  • 基于SSM农业信息管理系统的设计l
  • unity开发之绳子制作 obi rope