首页 > 其他分享 >shared_ptr 循环引用以及解决办法

shared_ptr 循环引用以及解决办法

时间:2024-01-13 20:57:19浏览次数:21  
标签:count 解决办法 printf shared ptrB ptr ptrA

问题代码

#include <memory>
#include <stdio.h>
using namespace std;

class A;
class B
{
public:
    B() { printf("B()\n"); }
    ~B() { printf("~B()\n"); }
	void print(){ printf("B\n"); }
    shared_ptr<A> ptrA_;
};

class A
{
public:
    A() {printf("A()\n"); }
    ~A() { printf("~A()\n"); }
    shared_ptr<B> ptrB_;
};

int main()
{
    auto a = std::make_shared<A>();
    auto b = std::make_shared<B>();

    a->ptrB_ = b;
    b->ptrA_ = a;

    printf("user count:%d %d\n", a->ptrB_.use_count(), b->ptrA_.use_count());
    return 0;
}

最后打印:
user count:2 2
循环引用,内存泄漏

改进版本

使用

 shared_ptr<A> ptrA_ 改为 weakptr<A> ptrA_

但是类里面无法使用ptrA_, 因为weakptr只有访问权限没有控制权限
如果需要控制ptrA_, 可以这样写:

in A:
    void A::func() {
        shared_ptr<B> b = ptrB_.lock();
        if (nullptr != b) {
            b->print();
        }
    }
in:B
void print() { printf("a good function B\n"); }

最终代码如下

#include <memory>
#include <stdio.h>
using namespace std;

class A;
class B
{
public:
    B() { printf("B()\n"); }
    ~B() { printf("~B()\n"); }
    void print() { printf("a good function B\n"); }
    weak_ptr<A> ptrA_;
};

class A
{
public:
    A() {printf("A()\n"); }
    ~A() { printf("~A()\n"); }
    void func() {
        shared_ptr<B> b = ptrB_.lock();
        if (nullptr != b) {  //这里很重要,来判断是否能拿到制作的控制权
            b->print();
        }
    }
    weak_ptr<B> ptrB_;
};

int main()
{
    auto a = std::make_shared<A>();
    auto b = std::make_shared<B>();

    a->ptrB_ = b;
    b->ptrA_ = a;
    a->func();

    printf("user count:%d %d\n", a->ptrB_.use_count(), b->ptrA_.use_count());
    return 0;
}

标签:count,解决办法,printf,shared,ptrB,ptr,ptrA
From: https://www.cnblogs.com/luoyinjie/p/17962908

相关文章

  • Python中出现"No module named 'requests'"的图文解决办法
    第一步找到pycharm中的虚拟环境的位置第二步打开虚拟环境位置的文件夹 找到Scripts的这个文件夹然后复制该文件夹的地址第三步打开“运行”(可以用快捷键WIN+R键打开)然后输入cmd第四步切换目录到虚拟环境的盘符输入“D:”(我的虚拟环境在D盘所以切换到D盘)第五......
  • 游戏被攻击,有没有什么好的解决办法
    游戏行业是DDoS攻击的主要目标了。每当遭受攻击,都会带来游戏不可用,经常会遭受到勒索损失或营收日直接损失,高者损至千万。最关键的是在活动、新游戏发布以及节假日游戏高峰时间段,如若遭受DDoS攻击,那么游戏公司损失更加明显,并且还会直接影响到玩家的游戏体验,造成用户流失,直接缩短游戏......
  • 常见的HTTP接口超时问题出现原因及解决办法
    HTTP接口超时问题是指在HTTP请求发送到服务器后,由于等待服务器响应的时间超过了预设的超时时间,导致请求被中断。以下是可能导致HTTP接口超时问题的原因和解决方法:网络延迟或不稳定:网络延迟或不稳定可能导致请求在传输过程中耗费的时间超过了预设的超时时间。解决方法是优化网络环境......
  • 澳洲本科留学论文学术不诚信被发现受开除处/分,解决办法看这里
    澳洲本科留学论文代/写被发现受开除处/分,解决办法看这里D同学高中毕业之后留学澳洲,本科期间课程论文较多,于是在网上找人代/写的。并且花了不少钱。论文完成质量确实是搞,完全按照教授的要求完成。D同学交完作业的时候,觉得心里的石头稳妥的放下了,可以放松了……一周之后,D同学收到了教......
  • 23年最新版pycharm找不到conda可执行文件解决办法
    引言我下载的是2023年最新版本的pycharm,新版的pycharm安装好了之后就会出现一个问题,就是在配置conda虚拟环境找不到conda的可执行文件,出现了以下问题。遇到这个问题有两种解决办法。解决办法1、第一种按照以下步骤,找到condabin文件下面,conda.bat文件,把路径给复制下来......
  • 英国本科留学三年拿不到学位,各有各的解决办法
    英国本科留学三年拿不到学位,各有各的解决办法在英国留学期间,学分不够、挂科太多、出勤率太低无法进入下一阶段学习,甚至直接受到停学、劝退处分的情况并不少。同时还会有学生在临近毕业之际,因为论文不过关而无法毕业。学业无法完成,必然先解决学业事宜。先想办法继续完成学业。那完成......
  • IOS移动端,表单input聚焦时页面放大的问题解析以及解决办法
    在移动端开发H5项目中,发现页面在使用iPhone访问的时候,点击input和textarea等文本输入框聚焦focus()时,页面会整体放大,而且失去焦点之后页面不能返回原来的样子。原因:苹果系统觉得点击输入框放大是一个“很好”的体验,就擅自把页面给放大了,触发机制,IOS端input字体应大于15px,否......
  • android TV 网络受限解决办法
    采用wifi或者有限网口adb方式保证在同一个局域网1、打开adb设置-系统-关于-连续点击AndroidTV操作系统版本,会有提示要打开发者选项,在开发者选项内勾选USB调试2、电脑连接adbadbconnect空格(192.168.xxx.xxx.)(xxx.xxx内是你电视盒子的IP地址)一.解决网络受限1.通过ADB......
  • Chrome等浏览器下出现net ERR_BLOCKED_BY_CLIENT的解决办法
    当我们在做开发时,调试页面图片会出现部分图片无法正常显示,并且确认图片的地址正确;按F12Debug查看报错原因,提示net::ERR_BLOCKED_BY_CLIENT错误,但当我们点击图片地址发现,图片地址并无错误;遇到这类情况,一般都是浏览器安装的某个第三方扩展程序已阻止对此网页的访问,例如解决办法:当我......
  • 关于宝塔面板设置了域名访问后但是域名解析有问题导致原有的ip+端口无法访问的解决办
    前言:因为购买了腾讯云的vps,dnspod购买了一个域名,已经将搭建的博客和私有云均做了dns解析,突然想起宝塔也可以这样访问,但是解析出了点问题,默认无法通过域名直接解析服务器公网ip+端口想改好来但是域名和ip形式都已经无法访问,那则呢么办么,看操作  解决步骤:1、登录到vps服务器......