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

 推荐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>

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

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

相关文章

JavaScript基础之输入输出与变量常量详解

输入和输出 输出和输入也可理解为人和计算机的交互&#xff0c;用户通过键盘、鼠标等向计算机输入信息&#xff0c;计算机处理后再展示结果给用户&#xff0c;这便是一次输入和输出的过程。 举例说明&#xff1a;如按键盘上的方向键&#xff0c;向上/下键可以滚动页面&#x…

C语言实现插入排序算法(附带源代码)

插入排序 插入排序&#xff08;英语&#xff1a;Insertion Sort&#xff09;是一种简单直观的排序算法。它的工作原理是通过构建有序序列&#xff0c;对于未排序数据&#xff0c;在已排序序列中从后向前扫描&#xff0c;找到相应位置并插入。插入排序在实现上&#xff0c;通常…

opencv012 滤波器04 中值滤波,双边滤波

中值滤波 取中位数&#xff0c;可以处理椒盐噪音 CV自带medianBlur函数dst cv2.medianBlur(src, ksize) 参数说明&#xff1a;1.src: 需要滤波的图片&#xff1b;2.ksize&#xff1a;核大小&#xff0c;必须是比1大的奇数【举个例子&#xff1a;3&#xff0c;5&#xff0c;7……

【RT-DETR有效改进】 | 主干篇 | RevColV1可逆列网络(特征解耦助力小目标检测)

前言 大家好&#xff0c;这里是RT-DETR有效涨点专栏。 本专栏的内容为根据ultralytics版本的RT-DETR进行改进&#xff0c;内容持续更新&#xff0c;每周更新文章数量3-10篇。 专栏以ResNet18、ResNet50为基础修改版本&#xff0c;同时修改内容也支持ResNet32、ResNet101和PP…

JDBC(Java DataBase Connectivity )

图片来源&#xff1a;动力节点老杜的JDBC视频讲解 JDBC&#xff08;Java DataBase Connectivity &#xff09; 一、JDBC 的本质二、开始前的准备工作三、关于 JDBC 中的事务四、JDBC 编程六步1.注册驱动2.获取连接3.获取数据库操作对象4.执行SQL语句5.处理结果查询集6.释放资源…

SpringBoot_基础

学习目标 基于SpringBoot框架的程序开发步骤 熟练使用SpringBoot配置信息修改服务器配置 基于SpringBoot的完成SSM整合项目开发 一、SpringBoot简介 1. 入门案例 问题导入 SpringMVC的HelloWord程序大家还记得吗&#xff1f; SpringBoot是由Pivotal团队提供的全新框架&…

docker指令存档

目录 Docker 1、概念 2、架构图 3、安装 4、Docker怎么工作的&#xff1f; 5、Docker常用命令 帮助命令 镜像命令 1、查看镜像 2、帮助命令 3、搜索镜像 4、拉取镜像 5、删除镜像 容器命令 1、启动 2、查看运行的容器 3、删除容器 4、启动&停止 其他命令…

苹果Find My市场需求火爆,伦茨科技ST17H6x芯片助力客户量产

苹果发布AirTag发布以来&#xff0c;大家都更加注重物品的防丢&#xff0c;苹果的 Find My 就可以查找 iPhone、Mac、AirPods、Apple Watch&#xff0c;如今的Find My已经不单单可以查找苹果的设备&#xff0c;随着第三方设备的加入&#xff0c;将丰富Find My Network的版图。产…

蓝桥杯备战——3.定时器前后台

1.STC15F2k61S2的定时器 阅读STC15系列的手册&#xff0c;我们可以看到跟STC89C52RC的定时器还是有不同之处的&#xff1a; 由上图可以看到我们可以通过AUXR寄存器直接设置定时器的1T/12T模式了 在定时器0/1模式上也可以设置为16位自动重装载。 另外需要注意IAP15F2K61S2只有…

python 学习之 re库的基本使用(正则匹配)上

目录 一、基本用法 二、函数介绍 1、match函数 2、search 函数 3、compile 函数 4、findall 和 finditer 函数 5、sub 函数和 subn 函数 6、split 函数 一、基本用法 首先我们需要引入 re 库 代码基本框架使用两行代码实现 测试代码&#xff1a; import reret re.m…

Linux管道学习(无名管道)

目录 1、概述 2、管道的创建 3、管道读写行为 3.1、管道读 在linux中管道有两种&#xff0c;一是无名管道&#xff08;匿名管道&#xff09;&#xff0c;第二种是有名管道&#xff1b;无名管道主要用于有血缘关系的父子进程间通信&#xff0c;有名管道则不受该限制&#xf…

描绘未知:数据缺乏场景的缺陷检测方案

了解更多方案内容&#xff0c;欢迎您访问官网&#xff1a;neuro-T | 友思特 机器视觉 光电检测&#xff1b;或联系销售经理&#xff1a;18124130753 导读&#xff1a; 深度学习模型帮助工业生产实现更加精确的缺陷检测&#xff0c;但其准确性可能受制于数据样本的数量。友思特…

Gradle学习笔记:Gradle的简介、下载与安装

文章目录 一、什么是Gradle二、为什么选择Gradle三、下载并安装Gradle四、Gradle的bin目录添加到环境变量五、测试Gradle是否安装正常 一、什么是Gradle Gradle是一个开源构建自动化工具&#xff0c;专为大型项目设计。它基于DSL&#xff08;领域特定语言&#xff09;编写&…

科大讯飞 再次引爆Ai

去年「科大讯飞版ChatGPT」星火大模型刚上线的时候&#xff0c;小编给大家推荐过一波&#xff0c;演示了其强大的功能&#xff0c;不少小伙伴都立马申请体验了一把&#xff0c;有小伙伴还私信我说功能非常强大&#xff0c;工作效率提高不少&#xff0c;支持国产大模型之类赞扬。…

idea 打包跳过测试

IDEA操作 点击蓝色的小球 手动命令 mvn clean package -Dmaven.test.skiptrue

音频格式之AAC:(2)AAC封装格式ADIF,ADTS,LATM,extradata及AAC ES存储格式

系列文章目录 音频格式的介绍文章系列&#xff1a; 音频编解码格式介绍(1) ADPCM&#xff1a;adpcm编解码原理及其代码实现 音频编解码格式介绍(2) MP3 &#xff1a;音频格式之MP3&#xff1a;(1)MP3封装格式简介 音频编解码格式介绍(2) MP3 &#xff1a;音频格式之MP3&#x…

unity学习笔记----游戏练习07

一、僵尸攻击和植物的掉血和销毁 当僵尸接触到植物开始攻击时会持续削减植物的血量&#xff0c;当植物血量为零时就销毁当前植物。 在plantManager中&#xff0c; 为植物添加一个血量HP 100&#xff0c; public int HP 100; 在写一个减少血量的方法&#xff0c;来减少血…

【RabbitMQ】交换机的概念及使用

一、引言 1、什么是交换机 RabbitMQ中&#xff0c;交换机是一个核心概念&#xff0c;主要用来将生产者生产出来的消息&#xff0c;传送到对应的队列中。实际上&#xff0c;生产者生产的消息从不会直接发送到队列&#xff0c;而是发送到交换机。交换机一方面接收来自生产者的消…

golang入门

学习方法 1、在实践中学 2、适当的囫囵吞枣&#xff0c;有可能学到后面&#xff0c;对前面的疑问焕然大悟 3、注重整体&#xff0c;刚开始不要去扣细节 安装 需要配置3个环境变量&#xff0c;如果.msi文件安装时设置好了就不需要了&#xff0c;自己可以检查下 GOROOT&…

【Unity】粒子贴图异常白边问题

从PS制作的黑底&#xff0c;白光的贴图。放入Unity粒子中&#xff0c;拉远看会有很严重的白边&#xff0c;像马赛克一样。 材质使用&#xff1a;Mobile/Particles/Additive 经测试只使用一张黑色的图片&#xff0c;也会有白边。 解决方案&#xff1a; 关闭黑色底&#xf…