首页 > 其他分享 >为什么weak_ptr可以解决循环引用问题

为什么weak_ptr可以解决循环引用问题

时间:2024-03-14 17:24:16浏览次数:17  
标签:销毁 对象 weak 循环 引用 ptr

weak_ptr 可以解决循环引用问题的主要原因在于它不会增加对象的引用计数,从而不会导致对象无法被销毁。

在循环引用中,两个或多个对象相互持有对方的 shared_ptr,导致对象的引用计数始终不为零,即使程序不再使用这些对象,它们也无法被销毁,从而造成内存泄漏。

weak_ptr 的引入可以打破这种循环引用。weak_ptr 是一种弱引用,它指向 shared_ptr 管理的对象,但不会增加对象的引用计数。当对象的所有 shared_ptr 都销毁后,对象就会被释放,即使还有 weak_ptr 指向它。

因此,当两个对象之间存在循环引用时,可以将其中一个对象的引用类型改为 weak_ptr,这样就可以防止循环引用导致的内存泄漏。当另一个对象被销毁后,它持有的 weak_ptr 将会失效,不再指向任何对象,从而释放被循环引用的对象。

标签:销毁,对象,weak,循环,引用,ptr
From: https://www.cnblogs.com/whcjob/p/18073342

相关文章

  • 【Zotero】【国标csl调教(六)】author date格式正文引用中只有两个作者 需要表示为A and
    这个问题困扰了笔者很久,之前的方法是在unlink之后手动修改,但是还是应该找一找在csl里解决的方法,但是目前网上几乎都不到相关的帖子,这里要感谢这一篇简书https://www.jianshu.com/p/5c8b72dfd9f8提供了在csl在线编辑器修改的思路以及具体路径。需求一般要求,authordate格式......
  • MogDB openGauss 自定义snmptrapd告警信息
    MogDB/openGauss自定义snmptrapd告警信息本文出处:https://www.modb.pro/db/232391在之前的文章MogDB/openGauss监控告警配置介绍了如何通过alertmanager模块将报警通过snmp推送出去,但是在实际使用中,默认的报警规则信息并不能很好的满足snmp服务端的需求,需要定制化报警......
  • 1.2引用
    1、引用的基本使用引用的作用:给变量起别名语法:数据类型&别名=原名为什么a输出的也是20?因为不管我们呢是用原名a来操作它,还是用别名b来操作它,我们所修改的都是同一块内存。回忆:操作系统中讲的共享2、引用的注意事项引用必须初始化引用在初始化后,不可以再改变了!点击......
  • Java 引用变量的比较
    在Java中,当你使用双引号直接创建字符串时,如:Strings=“LXHYouth”;Strings2=“LXHYouth”;使用==运算符比较这两个引用时,结果为true然而,当你使用new关键字创建字符串对象时,情况就有所不同了:Strings3=newString(“LXHYouth”);//使用new关键字,s3指向堆中的一......
  • vue3 循环引用的解决办法问题,Cannot access ‘xxxx‘ before initialization
    ReferenceError:Cannotaccess‘xxxx‘beforeinitialization ,原因之前已经初始化过,但页面组件嵌套,需要被重复引用。1、开启异步引用来解决components:{DeviceManage:defineAsyncComponent(()=>import('@/views/operation/mechanism/index.vue'))}2、用ifrme来......
  • LabVIEW中引用的概念及在VI间传递值
    一引用的概念LabVIEW中有一个重要概念:引用。引用的本质是一个临时指针,它可以指向一个具体的对象,并为其分配内存空间,是对象在程序中的唯一标识。尽管LabVIEW不是纯粹面向对象的语言,但引用的概念与其它面向对象的语言,例如:C++,基本相同。我们可以把LabVIEW中的控件、VI、应用程......
  • Java是值传递还是引用传递?
    1、典型回答值传递(Passbyvalue)和引用传递(Passbyreference)是关于参数传递方式的两个概念值传递:将传递参数的值,复制一份到方法的参数中。换句话说,值传递的是原始数据的一个副本,而不是原始数据本身引用传递:将实际参数的引用(内存地址)传递给方法,这意味着方法内部对参数的修改......
  • 高德地图 离线地图jsapi2.0 插件引用
    当引用一个插件,但是这个插件没有时会报错:UncaughtTypeError:AMap.ControlBarisnotaconstructor这里引用了罗盘这个插件这时候需要翻看高德的离线js了目前有两种逻辑:一个是同级目录下下载一个对应插件的js。还有一个是目录下有mapsplugin.js,通过这个插件来加载的,那么......
  • 实现一个简单的 std::unique_ptr
    实现一个简单的std::unique_ptr简介std::unique_ptr是一个独占资源所有权的智能指针,通过RAII来自动管理资源的构造和析构。在标准库中,std::unique_ptr的通常实现是具有空基类优化。具体来讲,对于std::unique_ptr的删除器是其类型中的一部分,如果没有空基类优化,那么std::u......
  • UE 共享指针 共享引用
    classFTestA{public: FTestA(){ UE_LOG(LogTemp,Warning,TEXT("FTestA构造")); } voidTestFun(){ UE_LOG(LogTemp,Warning,TEXT("FTestATestFun方法")); } ~FTestA(){ UE_LOG(LogTemp,Warning,TEXT("FTestA析构")); }};......