计数指针:shared_ptr (共享指针)与函数 笔记

news2024/10/6 20:27:58

 推荐B站视频:

4.shared_ptr计数指针_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV18B4y187uL?p=4&vd_source=a934d7fc6f47698a29dac90a922ba5a3

5.shared_ptr与函数_哔哩哔哩_bilibiliicon-default.png?t=N7T8https://www.bilibili.com/video/BV18B4y187uL?p=5&vd_source=a934d7fc6f47698a29dac90a922ba5a3

一、计数指针:shared_ptr

  • shared_ptr 计数指针又称为共享指针
  • unique_ptr不同的是它是可以共享数据的

二、shared_ptr

    - shared_ptr创建了一个计数器与类对象所指的内存相关联

    - Copy则计数器加一销毁则计数器减一

    - apiuse_count()

三、通过例子来

  • 常量类型的shared_ptr
  • 自定义类型的shared_ptr

(1)常量类型的shared_ptr

#include <iostream>
#include <memory>
#include "cat.h"
using namespace std;
int main(int argc,char* argv[]) {
    // 常量类型
    std::shared_ptr<int> i_p_1 = make_shared<int>(10);
    // std::shared_ptr<int> i_p_1 = make_shared<int>(new int(10));
    cout<<"value : "<<*i_p_1<<endl;
    cout<<"use count : "<<i_p_1.use_count()<<endl; // 1
    // copy
    std::shared_ptr<int> i_p_2 = i_p_1; 
    cout<<"use count : "<<i_p_1.use_count()<<endl; // 2
    cout<<"use count : "<<i_p_2.use_count()<<endl; // 2
    *i_p_2 = 20; // 修改值,两个指针指向同一内存,值都改变。
    cout<<"value : "<<*i_p_1<<endl; // 20
    cout<<"value : "<<*i_p_2<<endl; // 20

    std::shared_ptr<int> i_p_3 = i_p_1; // 第三个指针指向同一内存
    i_p_1 = nullptr;
    cout<<"use count : "<<i_p_1.use_count()<<endl; // 0
    cout<<"use count : "<<i_p_2.use_count()<<endl; // 2
    cout<<"use count : "<<i_p_3.use_count()<<endl; // 2

    cout<<"over~"<<endl;
    return 0;
}

运行结果:

PS D:\Work\C++UserLesson\cppenv\bin\Debug> ."D:/Work/C++UserLesson/cppenv/bin/Debug/app.exe"
value : 10
use count : 1
use count : 2
use count : 2
value : 20
value : 20
use count : 0
use count : 2
use count : 2
over~
PS D:\Work\C++UserLesson\cppenv\bin\Debug>

(2)自定义类型的shared_ptr

#include <iostream>
#include <memory>
#include "cat.h"
using namespace std;
int main(int argc,char* argv[]) {
    // 自定义类型
    std::shared_ptr<Cat> c_p_1 = make_shared<Cat>();
    cout<<"use count : "<<c_p_1.use_count()<<endl; // 1
    std::shared_ptr<Cat> c_p_2 = c_p_1; // 第二个指针指向同一内存
    std::shared_ptr<Cat> c_p_3 = c_p_1; // 第三个指针指向同一内存

    cout<<"use count : "<<c_p_1.use_count()<<endl; // 3
    cout<<"use count : "<<c_p_2.use_count()<<endl; // 3
    cout<<"use count : "<<c_p_3.use_count()<<endl; // 3

    c_p_1.reset();
    cout<<"use count : "<<c_p_1.use_count()<<endl; // 0
    cout<<"use count : "<<c_p_2.use_count()<<endl; // 2
    cout<<"use count : "<<c_p_3.use_count()<<endl; // 2

    cout<<"over~"<<endl;
    return 0;
}

执行结果:

PS D:\Work\C++UserLesson\cppenv\bin\Debug> ."D:/Work/C++UserLesson/cppenv/bin/Debug/app.exe"
use count : 1
use count : 3
use count : 3
use count : 3
use count : 0
use count : 2
use count : 2
over~
Destructor of Cat
PS D:\Work\C++UserLesson\cppenv\bin\Debug>

四、shared_ptr与函数

  • shared_ptr passed by value
    • copy
    • 函数内部计数器加一
  • shared_ptr passed by ref
    • const 表示不可改变指向
  • returning by value

 (1)shared_ptr passed by value

#include <iostream>
#include <memory>
#include "cat.h"
using namespace std;

void cat_by_value(std::shared_ptr<Cat> cat) {
    cout<<cat->get_name()<<endl;
    cat->set_cat_name("JiaFeiMao");
    cat->catInfo();
    cout<<"func use count : "<<cat.use_count()<<endl;//2
}

int main(int argc,char* argv[]) {
    std::shared_ptr<Cat> c1 = make_shared<Cat>("TomCat");
    cat_by_value(c1);
    c1->catInfo();
    cout<<"c1 use count : "<<c1.use_count()<<endl; // 1
    cout<<"over~"<<endl;
    return 0;
}
PS D:\Work\C++UserLesson\cppenv\bin\Debug> ."D:/Work/C++UserLesson/cppenv/bin/Debug/app.exe"
Constructor of Cat : TomCat
TomCat
cat info name : JiaFeiMao
func use count : 2
cat info name : JiaFeiMao
c1 use count : 1
over~
Destructor of Cat
PS D:\Work\C++UserLesson\cppenv\bin\Debug>

 (2)shared_ptr passed by ref

#include <iostream>
#include <memory>
#include "cat.h"
using namespace std;

void cat_by_ref(std::shared_ptr<Cat> &cat) {
    cout<<cat->get_name()<<endl;
    cat.reset(new Cat());
    cat->catInfo();
    cout<<"func use count : "<<cat.use_count()<<endl;//1
}

int main(int argc,char* argv[]) {
    std::shared_ptr<Cat> c1 = make_shared<Cat>("TomCat");
    cat_by_ref(c1);
    c1->catInfo();
    cout<<"over~"<<endl;
    return 0;
}
PS D:\Work\C++UserLesson\cppenv\bin\Debug> ."D:/Work/C++UserLesson/cppenv/bin/Debug/app.exe"
Constructor of Cat : TomCat
TomCat
Destructor of Cat
cat info name : Mimi
func use count : 1
cat info name : Mimi
over~
Destructor of Cat
PS D:\Work\C++UserLesson\cppenv\bin\Debug>

 注意:如果加上const就不能使用reset

#include <iostream>
#include <memory>
#include "cat.h"
using namespace std;

void cat_by_ref(const std::shared_ptr<Cat> &cat) {
    cout<<cat->get_name()<<endl;
    // cat.reset(new Cat()); error
    cat->catInfo();
    cout<<"func use count : "<<cat.use_count()<<endl;//1
}

int main(int argc,char* argv[]) {
    /*
    // 自定义类型
    std::shared_ptr<Cat> c_p_1 = make_shared<Cat>();
    cout<<"use count : "<<c_p_1.use_count()<<endl; // 1
    std::shared_ptr<Cat> c_p_2 = c_p_1; // 第二个指针指向同一内存
    std::shared_ptr<Cat> c_p_3 = c_p_1; // 第三个指针指向同一内存

    cout<<"use count : "<<c_p_1.use_count()<<endl; // 3
    cout<<"use count : "<<c_p_2.use_count()<<endl; // 3
    cout<<"use count : "<<c_p_3.use_count()<<endl; // 3

    c_p_1.reset();
    cout<<"use count : "<<c_p_1.use_count()<<endl; // 0
    cout<<"use count : "<<c_p_2.use_count()<<endl; // 2
    cout<<"use count : "<<c_p_3.use_count()<<endl; // 2
    */

    std::shared_ptr<Cat> c1 = make_shared<Cat>("TomCat");
    cat_by_ref(c1);
    c1->catInfo();
    cout<<"over~"<<endl;
    return 0;
}
PS D:\Work\C++UserLesson\cppenv\bin\Debug> ."D:/Work/C++UserLesson/cppenv/bin/Debug/app.exe"
Constructor of Cat : TomCat
TomCat
cat info name : TomCat
func use count : 1
cat info name : TomCat
over~
Destructor of Cat
PS D:\Work\C++UserLesson\cppenv\bin\Debug>

(3)returning by value

#include <iostream>
#include <memory>
#include "cat.h"
using namespace std;

std::shared_ptr<Cat> get_shared_ptr() { 
    std::shared_ptr<Cat> cat_p = std::make_shared<Cat>("lanmao");
    return cat_p;
}

int main(int argc,char* argv[]) {
    std::shared_ptr<Cat> c_p = get_shared_ptr();
    c_p->catInfo();

    get_shared_ptr()->catInfo();
    cout<<"over~"<<endl;
    return 0;
}

执行结果:

PS D:\Work\C++UserLesson\cppenv\bin\Debug> ."D:/Work/C++UserLesson/cppenv/bin/Debug/app.exe"
Constructor of Cat : lanmao
cat info name : lanmao
Constructor of Cat : lanmao
cat info name : lanmao
Destructor of Cat
over~
Destructor of Cat
PS D:\Work\C++UserLesson\cppenv\bin\Debug>

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AI引爆算力需求,思腾推出支持大规模深度学习训练的高性能AI服务器

近日人工智能研究公司OpenAI公布了其大型语言模型的最新版本——GPT-4&#xff0c;可10秒钟做出一个网站&#xff0c;60秒做出一个游戏&#xff0c;参加了多种基准考试测试&#xff0c;它的得分高于88%的应试者&#xff1b;随后百度CEO李彦宏宣布正式推出大语言模型“文心一言”…

扫雷游戏——数组和函数实现

扫雷游戏的功能说明 使⽤控制台实现经典的扫雷游戏 游戏可以通过菜单实现继续玩或者退出游戏扫雷的棋盘是9*9的格⼦ 默认随机布置10个雷可以排查雷如果位置不是雷&#xff0c;就显⽰周围有⼏个雷如果位置是雷&#xff0c;就炸死游戏结束把除10个雷之外的所有⾮雷都找出来&…

域名缩短平台搭建

前言 当自己搭建的项目和网站相关文章的链接过长&#xff0c;可以参考一下本文搭建的平台 遵纪守法&#xff0c;不要乱缩网址。 代码&#xff1a; https://github.com/dyanst/shorturlhttps://github.com/dyanst/shorturl shorturl-main.zip官方版下载丨最新版下载丨绿色版…

Linux(linux版本 centos 7) 下安装 oracle 19c详细教程(新手小白易上手)

一、安装前准备 1、下载预安装包 wget http://yum.oracle.com/repo/OracleLinux/OL7/latest/x86_64/getPackage/oracle-database-preinstall-19c-1.0-1.el7.x86_64.rpm预安装包下载成功 2、下载oracle安装包 下载地址如下 https://www.oracle.com/cn/database/technologies…

Maven命令运行单元测试

使用idea开发多模块项目时,有时别的模块编译不通过会导致不能运行单元测试,这是我们可以使用maven命令来运行单元测试 格式 mvn -DtestDingTalkTest#getAllUsers 命令说明 mvn -Dtest 固定格式 DingTalkTest 单元测试类名 getAllUsers 单元测试方法 单元测试类和单元测试方法…

【LUA】mac状态栏添加天气

基于网络上的版本修改的&#xff0c;找不到出处了。第一个摸索的lua脚本&#xff0c;调了很久。 主要修改&#xff1a;如果风速不大&#xff0c;就默认不显示&#xff0c;以及调整为了一些格式 local urlApi http://.. --这个urlApi去申请个免费的就可以了 然后打开对应的json…

云轴科技ZStack成为交通运输业上云用云推进中心首批成员单位

近日&#xff0c;中国信息通信研究院、中国交通运输协会信息专业委员会联合发起成立“交通运输业上云用云推进中心”&#xff0c;上海云轴信息科技有限公司&#xff08;简称云轴科技ZStack&#xff09;凭借优秀的产品技术创新能力和在交通运输领域的实践经验成为首批成员单位并…

《安富莱嵌入式周报》第331期:单片机实现全功能软件无线电,开源电源EEZ升级主控,ARM 汇编用户指南,UDS统一诊断服务解析,半导体可靠性设计手册

周报汇总地址&#xff1a;嵌入式周报 - uCOS & uCGUI & emWin & embOS & TouchGFX & ThreadX - 硬汉嵌入式论坛 - Powered by Discuz! 目录&#xff1a; 1、单片机实现低配版全功能软件无线电&#xff0c;范围0.5-30 MHz&#xff0c;支持SSB、AM、FM和CW …

浅谈电气火灾监控系统应用在某地铁车站

安科瑞电气股份有限公司 上海嘉定201801 摘要&#xff1a;根据国家有关规范对建筑电气火灾监测系统设置的要求&#xff0c;结合当地城市地铁供配电方案的特点&#xff0c;介绍了地铁站电气火灾监测系统设置方案&#xff0c;从电气火灾探测器的选择和位置设置、电气火灾监测设备…

Java项目:SSM框架基于spring+springmvc+mybatis实现的心理预约咨询管理系统(ssm+B/S架构+源码+数据库+毕业论文)

一、项目简介 本项目是一套ssm823基于SSM框架的心理预约咨询管理系统&#xff0c;主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&am…

WWDG喂狗

3F 是0111111 40 是1000000 0X7F 127 0X5F 95 127-9532 注意:中断是在0x40,在0x40喂狗则程序不会复位 在0x5F之前喂狗会复位,减小到63以下也会复位 在0x5F与0x3F之间喂狗会继续执行,不会复位 WWDG_HandleTypeDef WWDG_Handler; //窗口看门狗句柄//初始化窗口看门狗…

Java接收curl发出的中文请求无法解析

最近做项目遇到了这种情况&#xff0c;Java接收curl发出的中文请求无法解析&#xff0c;英文请求一切正常&#xff0c;中文请求则对方服务器无法解析&#xff0c;可以猜测是中文导致的编码问题&#xff0c;但是奇怪的是&#xff0c;本地输出json也没有乱码&#xff0c;编解码正…

洛谷刷题-【入门2】分支结构

目录 1.苹果和虫子 题目描述 输入格式 输出格式 输入输出样例 2.数的性质 题目描述 输入格式 输出格式 输入输出样例 3.闰年判断 题目描述 输入格式 输出格式 输入输出样例 4.apples 题目描述 输入格式 输出格式 输入输出样例 5.洛谷团队系统 题目描述 …

【数学笔记】一元n次不等式,分式不等式,绝对值不等式

不等式 基本性质 一元n次不等式一元二次不等式一元高次不等式分式不等式绝对值不等式 基本性质 性质 a > b ⇔ b < a a>b\Leftrightarrow b<a a>b⇔b<a a > b , b > c ⇒ a > c a>b,b>c\Rightarrow a>c a>b,b>c⇒a>c a > b ,…

Hbuilder从gitlab上面拉取项目

要先下载TortoiseGit-2.15.0.0-64bit这个软件 在HBuilder中从GitLab上拉取项目&#xff0c;请按照以下步骤操作&#xff1a; 1. 打开HBuilder&#xff0c;点击左上角的“文件”菜单&#xff0c;然后选择“新建”->“项目”。 2. 在弹出的对话框中&#xff0c;选择“从Git导…

redis主从复制薪火相传

一.主从复制 1、是什么 主机数据更新后根据配置和策略&#xff0c; 自动同步到备机的master/slaver机制&#xff0c;Master以写为主&#xff0c;Slave以读为主 2、能干嘛 读写分离&#xff0c;性能扩展&#xff08;主 写 从 读&#xff09; 容…

Spring Boot使用七牛云

一、引入和配置 //maven配置 <dependency><groupId>com.qiniu</groupId><artifactId>qiniu-java-sdk</artifactId><version>7.7.0</version> </dependency>#七牛云application.yml配置 qiniu:# 配置accessKeyaccessKey: &qu…

【Spring 篇】Maven私服:解锁项目构建新世界

嗨&#xff0c;亲爱的读者朋友们&#xff01;今天我们要探讨的话题是 Maven 私服。也许你已经听说过它&#xff0c;但是不知道如何入门&#xff0c;或者只是对它有一些模糊的认知。别担心&#xff0c;本篇博客将手把手地带你深入探索 Maven 私服的神秘世界。 什么是 Maven 私服…

无限学模式-“重塑科研学习路径:ChatGPT应用实战课,开启高效率、高创新的科研之旅!“

ChatGPT 在论文写作与编程方面也具备强大的能力。无论是进行代码生成、错误调试还是解决编程难题&#xff0c;ChatGPT都能为您提供实用且高质量的建议和指导&#xff0c;提高编程效率和准确性。此外&#xff0c;ChatGPT是一位出色的合作伙伴&#xff0c;可以为您提供论文写作的…

k8s中netty服务器容器tcp连接数量优化

netty的http1服务器在运行一段时间后会无法提供服务&#xff0c;返回客户端socket hang up 使用apipost测试抓包显示三次握手后被reset&#xff0c;经查是连接数过多 ps&#xff1a;客户端使用了大量短连接&#xff0c;如果能改成长连接就会消耗更少的连接&#xff0c;但是客户…