计数指针: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// copystd::shared_ptr<int> i_p_2 = i_p_1; cout<<"use count : "<<i_p_1.use_count()<<endl; // 2cout<<"use count : "<<i_p_2.use_count()<<endl; // 2*i_p_2 = 20; // 修改值,两个指针指向同一内存,值都改变。cout<<"value : "<<*i_p_1<<endl; // 20cout<<"value : "<<*i_p_2<<endl; // 20std::shared_ptr<int> i_p_3 = i_p_1; // 第三个指针指向同一内存i_p_1 = nullptr;cout<<"use count : "<<i_p_1.use_count()<<endl; // 0cout<<"use count : "<<i_p_2.use_count()<<endl; // 2cout<<"use count : "<<i_p_3.use_count()<<endl; // 2cout<<"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; // 1std::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; // 3cout<<"use count : "<<c_p_2.use_count()<<endl; // 3cout<<"use count : "<<c_p_3.use_count()<<endl; // 3c_p_1.reset();cout<<"use count : "<<c_p_1.use_count()<<endl; // 0cout<<"use count : "<<c_p_2.use_count()<<endl; // 2cout<<"use count : "<<c_p_3.use_count()<<endl; // 2cout<<"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; // 1cout<<"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()); errorcat->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; // 1std::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; // 3cout<<"use count : "<<c_p_2.use_count()<<endl; // 3cout<<"use count : "<<c_p_3.use_count()<<endl; // 3c_p_1.reset();cout<<"use count : "<<c_p_1.use_count()<<endl; // 0cout<<"use count : "<<c_p_2.use_count()<<endl; // 2cout<<"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.mzph.cn/news/648628.shtml

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

相关文章

YOLOV5目标检测---labelimg图片标注工具(1)

前言&#xff1a;在使用YOLO训练自己模型的时候首先要学会对数据进行处理&#xff0c;这里介绍一个常用的本地打标签工具labelimg&#xff0c;如果不想按照的话也可以使用在线标签工具&#xff0c;因为害怕数据泄露&#xff0c;所以本人一直使用的是本地工具进行打标签。在线标…

node.js漏洞总结

js开发的web应用和php/Java最大的区别就是js可以通过查看源代码的方式查看到编写的代码&#xff0c;但是php/Java的不能看到&#xff0c;也就是说js开发的web网页相当于可以进行白盒测试。 流行的js框架有&#xff1a; 1. AngularJS 2. React JS 3. Vue 4. jQuery 5. Backbone…

ppt作品展示能用二维码吗?文件二维码内容可替换怎么做?

当我们需要将自己的作品或者内容做成ppt文件之后&#xff0c;用二维码的方式来做展示&#xff0c;而且生成二维码还可以在图案不变的情况下&#xff0c;能够修改或者替换文件内容&#xff0c;实现二维码的长期使用。在遇到这种要求时&#xff0c;如何生成这种类型的二维码图片呢…

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

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

HFSS实战(三)——过孔via TDR仿真

文章目录 一、模型的处理二、TDR仿真2.1 修改求解模式2.2增加求解设置 三、查看仿真结果3.1 查看TDR结果3.2 查看S参数结果 四、结果分析4.1上升时间tr对仿真的影响 附&#xff1a;工程链接 在上一讲中&#xff0c;主要是通过观察S参数确定via的优化是否达到目标。但S参数只能看…

k8s 安全机制

k8s的安全机制&#xff1a; 核心&#xff1a;分布式集群管理工具&#xff0c;就是容器编排&#xff0c;安全机制的核心&#xff1a;API server 作为整个集群内部通信的中介&#xff0c;也是外控控制的入口。实验的安全机制都是围绕api server来进行设计&#xff1a; 请求api资…

利用nginx宝塔免费防火墙实现禁止国外IP访问网站

本章教程&#xff0c;主要介绍&#xff0c;如何利用nginx宝塔面板中的插件免费防火墙&#xff0c;实现一键禁止国外IP访问网站。 目录 一、安装宝塔插件 二、 开启防火墙 一、安装宝塔插件 在宝塔面板中的软件商店&#xff0c;搜索防火墙关键词&#xff0c;找到Nginx免费防火…

在线教育系统开发:构建现代化学习平台

随着科技的迅速发展&#xff0c;在线教育系统在教育领域扮演着越来越重要的角色。本文将深入探讨在线教育系统的开发过程&#xff0c;涉及关键技术和代码实现。 技术选型 在开始开发之前&#xff0c;我们首先需要选择适合在线教育系统的技术栈。以下是一些常见的技术选项&am…

代码随想录算法训练营29期|day31 任务以及具体安排

理论基础 关于贪心算法&#xff0c;你该了解这些&#xff01; 题目分类大纲如下&#xff1a; #算法公开课 《代码随想录》算法视频公开课 (opens new window)&#xff1a;贪心算法理论基础&#xff01; (opens new window),相信结合视频再看本篇题解&#xff0c;更有助于大家…

大创项目推荐 题目:基于LSTM的预测算法 - 股票预测 天气预测 房价预测

文章目录 0 简介1 基于 Keras 用 LSTM 网络做时间序列预测2 长短记忆网络3 LSTM 网络结构和原理3.1 LSTM核心思想3.2 遗忘门3.3 输入门3.4 输出门 4 基于LSTM的天气预测4.1 数据集4.2 预测示例 5 基于LSTM的股票价格预测5.1 数据集5.2 实现代码 6 lstm 预测航空旅客数目数据集预…

IO多路复用-epoll

IO多路复用-epoll 1. 概述 epoll 全称 eventpoll&#xff0c;是 linux 内核实现IO多路转接/复用&#xff08;IO multiplexing&#xff09;的一个实现。 epoll是select和poll的升级版&#xff0c;相较于这两个前辈&#xff0c;epoll改进了工作方式&#xff0c;因此它更加高效…

WorkPlus AI智能客服解决方案,提升企业服务质量

在当今竞争激烈的商业环境中&#xff0c;提供卓越的客户服务成为企业赢得市场竞争的关键。而AI智能客服技术的不断发展&#xff0c;则成为了提高服务效率和满意度的利器。作为一款领先的AI助理解决方案&#xff0c;WorkPlus AI助理以其出色的性能和智能化的功能&#xff0c;助力…

c++入门学习(十八)赋值运算符

简单赋值运算符&#xff08;&#xff09;&#xff1a; 最基本的赋值运算符是“”。它表示将右侧的值赋给左侧的变量。例如&#xff0c;x 5意味着将值5赋给变量x。 增量赋值运算符&#xff1a; 这是一组在赋值的同时对变量进行递增操作的运算符。常见的有、-、*、/等。例如&…

THM学习笔记——网络工具

ping 当我们想要测试是否可以连接到远程资源时&#xff0c;会使用 ping 命令。 ping 的基本语法&#xff1a; ping <target>。 测试是否可以与百度建立网络连接&#xff1a; traceroute 互联网由许多个不同的服务器和端点组成&#xff0c;它们都相互联网。这意味着&a…

Soul CEO张璐团队布局AIGC领域,打造数智化社交新体验

作为互联网社交领域的领军企业,Soul App近日再次受到广泛关注,因其在生成式人工智能(AIGC)领域的前沿布局和创新。随着数据积累、算力提升和算法不断迭代,AIGC技术正逐渐成为推动产业创新的重要工具之一。2023年被誉为AIGC元年,而Soul App在CEO张璐的带领下,在这个领域的不懈努…

计算CNN卷积层和全连接层的参数量

计算CNN卷积层和全连接层的参数量 先前阅读 CNN ExplainerA Comprehensive Guide to Convolutional Neural Networks — the ELI5 way 本文主旨意在搞明白2个问题&#xff1a; 第一个问题 一个卷积操作&#xff0c;他的参数&#xff0c;也就是我们要训练的参数&#xff0c;也…

Navigation 2 学习01 介绍及安装及运行示例

Navigation 2 是什么 Nav2 是 ROS 导航 的综合控制服务&#xff0c;类似人类的小脑控制人类的行走及身体平衡&#xff0c;Nav2 针对移动和地面机器人提供支持的自动驾驶车辆的相同类型的技术&#xff0c;经过优化和改造。该项目旨在找到一种安全的方法&#xff0c;使移动机器人…

nginx离线部署-aarch64架构

nginx离线部署-aarch64架构 服务器环境: 架构&#xff1a;aarch64&#xff0c; 系统&#xff1a;Red Hat &#xff08;CentOS 7&#xff09; nginx 1.24 需要准备这些&#xff1a; 可以先尝试安装 Nginx 安装NGINX 内网是没有网络的需要使用 RPM 包安装 gcc&#xff0c; g…

绘制太极图 - 使用 PyQt

大家好&#xff01;今天我们将一起来探讨一下如何使用PyQt&#xff0c;这是一个强大的Python库&#xff0c;来绘制一个传统的太极图。这个图案代表着古老的阴阳哲学&#xff0c;而我们的代码将以大白话的方式向你揭示它的奥秘。 PyQt&#xff1a;是什么鬼&#xff1f; 首先&a…

架构师之路(十六)计算机网络(传输层)

前置知识&#xff08;了解&#xff09;&#xff1a;计算机基础。 作为架构师&#xff0c;我们所设计的系统很少为单机系统&#xff0c;因此有必要了解计算机和计算机之间是怎么联系的。局域网的集群和混合云的网络有啥区别。系统交互的时候网络会存在什么瓶颈。 既然网络层已经…