c++ shared_ptr和weak_ptr结合应用实验

1.概要

  • shared_ptr和weak_ptr的reset实验
  • 用weak_ptr化解shared_ptr交叉引用的问题

2.代码

#include <iostream>
using namespace std;

template<typename T>
void fun(weak_ptr<T> wp) {
    if (wp.expired()) {
        cout << "Object has been released\n";
    }
    else {
        cout << "Object not released\n";
    }
}
namespace t1 {
    void test() {
        cout << "--- Release with shared_ptr -----------------------------\n";
        shared_ptr<int> sh_ptr = make_shared<int>();
        weak_ptr<int> wp(sh_ptr);
        fun<int>(wp);//结果:Object not released
        sh_ptr.reset();
        fun<int>(wp);//结果:Object has been released
    }
}
namespace t2 {
    void test() {
        cout << "--- Release with weak_ptr -----------------------------\n";
        shared_ptr<int> sh_ptr = make_shared<int>();
        weak_ptr<int> wp(sh_ptr);
        fun<int>(wp);//结果:Object not released
        //sh_ptr.reset();
        wp.reset();
        fun<int>(wp);//结果:Object has been released
    }
}

namespace t3 {
    class B;
    class A
    {
    public:
        A() {
            cout << "A constructor call\n";
        }
        ~A() {
            cout << "A Destructor call\n";
        }
        shared_ptr<B> sh_ptr_b;
    };
    class B
    {
    public:
        B() {
            cout << "A constructor call\n";
        }
        ~B() {
            cout << "A Destructor call\n";
        }
        shared_ptr<A> sh_ptr_a;
    };
    void test() {
        //这个实验会让交叉引用发生,导致对象无法析构
        cout << "--- Cross references cannot be destructed -----------------------------\n";
        shared_ptr<A> sh_ptr_a = make_shared<A>();
        shared_ptr<B> sh_ptr_b = make_shared<B>();
        cout << "ptr_a use_count: " << sh_ptr_a.use_count() << endl;
        cout << "ptr_b use_count: " << sh_ptr_b.use_count() << endl;
        sh_ptr_a.get()->sh_ptr_b = sh_ptr_b;
        sh_ptr_b.get()->sh_ptr_a = sh_ptr_a;
        //这里因为发生了交叉引用,所以对象最终不会析构,会发生内存泄露
        cout << "ptr_a use_count: " << sh_ptr_a.use_count() << endl;
        cout << "ptr_b use_count: " << sh_ptr_b.use_count() << endl;
    }
/*
运行结果:最后没有调用析构函数
A constructor call
A constructor call
ptr_a use_count: 1
ptr_b use_count: 1
ptr_a use_count: 2
ptr_b use_count: 2
*/
}
namespace t4 {
    class B;
    class A
    {
    public:
        A() {
            cout << "A constructor call\n";
        }
        ~A() {
            cout << "A Destructor call\n";
        }
        //shared_ptr<B> sh_ptr_b;
        //这是把shared_ptr<B>换成了weak_ptr<B>就化解了交叉引用
        weak_ptr<B> sh_ptr_b;
    };
    class B
    {
    public:
        B() {
            cout << "A constructor call\n";
        }
        ~B() {
            cout << "A Destructor call\n";
        }
        shared_ptr<A> sh_ptr_a;
    };
    void test() {
        //交叉引用的问题会得到解决
        cout << "--- Cross reference problem solved -----------------------------\n";
        shared_ptr<A> sh_ptr_a = make_shared<A>();
        shared_ptr<B> sh_ptr_b = make_shared<B>();
        cout << "ptr_a use_count: " << sh_ptr_a.use_count() << endl;
        cout << "ptr_b use_count: " << sh_ptr_b.use_count() << endl;
        sh_ptr_a.get()->sh_ptr_b = sh_ptr_b;
        sh_ptr_b.get()->sh_ptr_a = sh_ptr_a;
        //这里weak_ptr<B>会对这种引用做相应的处理所以 最终对象可以析构 不会发生内存泄露
        cout << "ptr_a use_count: " << sh_ptr_a.use_count() << endl;
        cout << "ptr_b use_count: " << sh_ptr_b.use_count() << endl;

    }
/*
测试结果:调用了析构函数
A constructor call
A constructor call
ptr_a use_count: 1
ptr_b use_count: 1
ptr_a use_count: 2
ptr_b use_count: 1
A Destructor call
A Destructor call*/
}
int main()
{
    t1::test();
    t2::test();
    t3::test();
    t4::test();
    cout << "Hello World!\n";
}

3.运行结果

--- Release with shared_ptr -----------------------------
Object not released
Object has been released
--- Release with weak_ptr -----------------------------
Object not released
Object has been released
--- Cross references cannot be destructed -----------------------------
A constructor call
A constructor call
ptr_a use_count: 1
ptr_b use_count: 1
ptr_a use_count: 2
ptr_b use_count: 2
--- Cross reference problem solved -----------------------------
A constructor call
A constructor call
ptr_a use_count: 1
ptr_b use_count: 1
ptr_a use_count: 2
ptr_b use_count: 1
A Destructor call
A Destructor call

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/570095.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

实时数据同步工具的真正作用和对应应用场景

在当今商业环境中&#xff0c;企业规模的不断扩大带来了对数据同步的更高要求。实时数据同步解决方案对于确保数据的一致性、提升业务灵活性以及增强决策的精准度具有关键作用。 本文将深入分析实时数据同步技术的关键优势&#xff0c;并探讨其在不同行业场景下的应用价值&…

复习python函数

复习python函数 1.对函数的理解函数的传递方式返回值 return可通过help()函数查看函数说明作用域 2.不定长参数3.递归4.高阶函数将函数作为参数传递将函数作为返回值返回 5.匿名函数6.装饰器 1.对函数的理解 函数可以用来保存一些可执行的代码&#xff0c;并且可以在需要时&am…

前端Vue中async/await、promise 和setTimeout工作原理和执行顺序

前端Vue中async/await、Promise 和 setTimeout 在 JavaScript 中都是处理异步操作的方法&#xff0c;但它们的工作原理和执行顺序有所不同。以下是它们的执行顺序和关系的简要说明&#xff1a; 同步代码执行&#xff1a;在任何异步操作开始之前&#xff0c;首先会执行所有的同步…

vr太阳光参数怎么设置,vr快速渲染方法

VR场景中实现逼真的光照效果&#xff0c;太阳光参数的设置尤为关键。真实的太阳光可提升效果图的质感&#xff0c;论VR太阳光参数的设置技巧&#xff0c;包括光源类型选择、光照强度调整、阴影效果优化等多个方面&#xff0c;喜爱一起来看看vr太阳光真实感设置参数吧。 vr太阳光…

大数据信用风险竟然是这样形成的!查询方法也很简单

在大数据时代背景下&#xff0c;大数据信用风险成为了众多机构关注的焦点。这类风险涵盖了多头借贷、履约行为、联系人以及司法等多个方面。本文将深入解析大数据信用风险的形成原因及其查询方法&#xff0c;让我们一起来探索一下。 大数据信用风险主要表现在以下几个方面&…

Python-GEE遥感云大数据分析、管理与可视化

原文链接&#xff1a;Python-GEE遥感云大数据分析、管理与可视化https://mp.weixin.qq.com/s?__bizMzUzNTczMDMxMg&mid2247601238&idx2&sn6b0557cf61451eaff65f025d648da869&chksmfa820db1cdf584a76de953b96519704177e6206d4ecd47a2f2fabbcac2f7ea619b0bce184…

Ubuntu镜像下载与安装2024.4版本(超适合新手)

前言&#xff1a; 在VMware中安装Ubuntu镜像&#xff0c;首先需要去下载镜像&#xff0c;但是由于服务器在国外&#xff0c;下载速度相对较慢&#xff0c;国内也有镜像&#xff0c;较推荐在国内镜像站下载&#xff0c;例如阿里镜像和清华镜像。 官网&#xff1a;Ubuntu系统下…

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第八套

华为 2024 届实习校园招聘-硬件通⽤/单板开发——第八套 部分题目分享&#xff0c;完整版带答案(有答案和解析&#xff0c;答案非官方&#xff0c;未仔细校正&#xff0c;仅供参考&#xff09;&#xff08;共十套&#xff09;获取&#xff08;WX:didadidadidida313&#xff0c…

hover显示播放遮罩层效果

我们都知道视频列表其实是一个封面列表,鼠标放上去时,有反馈:即hover时显示播放遮罩层,点击,跳转到对应的视频播放页。这是目前主流视频网站的一个通用效果。 我们在实现时应该理清思路: 1、每个视频位置处放的是封面图片 2、播放按钮遮罩层需完全覆盖封面图片,并且正…

vLLM-prefix浅析(System Prompt,大模型推理加速)

原文&#xff1a;vLLM-prefix浅析&#xff08;System Prompt&#xff0c;大模型推理加速&#xff09; 简介 本文浅析了在大模型推理加速方面一个非常优秀的项目 vLLM 的一个新特性 Prefix。在 Prompt 中有相同前缀时可以提高吞吐量降低延迟&#xff0c;换句话说可以省去这部分…

【做算法学数据结构】二叉树的层序遍历【二叉树】

文章目录 题目二叉树二叉树描述二叉树的java描述和前序遍历、后序遍历、中序遍历 题解总结以及二叉树应用场景 题目 给你二叉树的根节点 root &#xff0c;返回其节点值 自底向上的层序遍历 。 &#xff08;即按从叶子节点所在层到根节点所在的层&#xff0c;逐层从左向右遍历…

德思特GNSS模拟器为物流行业保驾护航

作者介绍 一、前言 德思特GNSS模拟器能够在最短的时间内高效、准确的协助完成虹科MSR运输数据记录仪的定位准确性以及抗干扰能力测试&#xff0c;确保在运输或存储过程中&#xff0c;让用户知道何时何地发生了超出预设公差范围的事件&#xff0c;快速、准确的记录定位数据&…

【UE 材质】水波纹效果

效果 模拟雨水打落在水面上的效果 步骤 1. 下载所需纹理和纹理 纹理2. 新建一个材质&#xff0c;这里命名为“M_WaterRipples” 打开“M_WaterRipples”&#xff0c;添加一个纹理采样节点&#xff0c;纹理使用第一步下载的纹理 将纹理采样节点的R通道连接到基础颜色&#x…

李沐57_长短期记忆网络LSTM——自学笔记

LSTM 1.忘记门&#xff1a;将值朝着0减少 2.输入门&#xff1a;决定不是忽略掉输入数据 3.输出门&#xff1a;决定是不是使用隐状态 !pip install --upgrade d2l0.17.5 #d2l需要更新首先加载时光机器数据集。 import torch from torch import nn from d2l import torch a…

Ajax和axios基础

AJAX Asynchronous JavaScript And XML 异步的JavaScript和XML 作用 数据交换: 通过Ajax可以给服务器发送请求,服务器将数据直接响应回给浏览器. 异步交互: 可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页的技术. 同步和异步 同步发送请求: 浏览器发…

阿斯达年代记账号注册教程 阿斯达年代记苹果id注册教程

阿斯达年代记账号注册教程 阿斯达年代记苹果id注册教程 即将开服的新款大型多人角色扮演类游戏阿斯达年代记三强争霸将于4月24号上线&#xff0c;小伙伴们可以在本次开服之后进行游戏&#xff0c;这款游戏除了常规的职业分化之外&#xff0c;目前开放了四种角色供玩家选择&…

getopt, getopt_long使用笔记

An element of argv that starts with - (and is not exactly "-" or "--") is an option element. The characters of this element (aside from the initial -) are option characters. 以-’开头的字符(注意!不是字符串!!)就是命令行参数选项 通…

C++中的程序流程结构

一、选择结构 1.1 if语句 作用&#xff1a;执行满足条件的语句 if语句的三种形式 单行格式if语句多行格式if语句多条件的if语句 #include <iostream> using namespace std;int main(){//选择结构 单行if语句//用户输入分数&#xff0c;如果分数>600,视为考上一本大…

代码随想录 Day19 字符串 | LC28 实现strStr() 【KMP经典题目】

六、实现strStr() 题目&#xff1a; 力扣28&#xff1a;找出字符串中第一个匹配的下标 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack…

全身照怎么缩小做头像?在线图片改大小尺寸的方法

在日常工作中&#xff0c;有不少人喜欢把自己的全身照作为微信或者QQ头像&#xff0c;这时候就经常遇到一个问题&#xff0c;就是图片尺寸太大&#xff0c;无法完整的展现&#xff0c;那么这个时候该怎么处理呢&#xff1f;可以试试下面介绍的这个在线图片改大小尺寸的方法&…
最新文章