【C++11】shared_ptr智能指针使用详解
系列文章目录
【C++11】智能指针与动态内存
文章目录
- 系列文章目录
- 简介
- 一、头文件
- 二、初始化
- 1. make_shared
- 2. 拷贝和赋值
- 三、实例
简介
shared_ptr 是一个类的模板,它使用引用计数的方式来管理一个动态分配的内存资源。shared_ptr 需要一个动态分配的对象时,会在堆上分配一块内存来存储该对象,并维护一个引用计数。
shared_ptr允许多个shared_ptr指向同一个对象,通过引用计数来跟踪有多少个shared_ptr指向同一个对象。每次创建一个新的shared_ptr指向同一个对象时,引用计数增加1。当一个shared_ptr离开作用域或被重置时,引用计数减少1。当引用计数变为0时,shared_ptr会自动删除所指向的对象并释放内存。
一、头文件
本文出现的关于shared_ptr的方法都包含在此头文件中
#include <memory>
二、初始化
1. make_shared
最安全方法是调用make_shared的标准库函数。同时引用计数从0到1。
// 指向一个值为默认值的int的shared_ptr:0
std::shared_ptr<int> p1 = make_shared<int>();
// 指向一个值为4的int的shared_ptr
std::shared_ptr<int> pt2 = make_shared<int>(4);
// 指向一个值为"555555"的string的shared_ptr
std::shared_ptr<std::string> p3= make_shared<string>(6, '5');
通常用定义一个auto对象来保存make_shared结果
// 指向一个值为默认值的int的shared_ptr:0
auto p4 = make_shared<int>();
2. 拷贝和赋值
通过拷贝和赋值也可以初始化。
auto p = make_shared<int>(4); // p指向的引用对象只有p一个引用者,此对象引用计数为1
auto q(p); // p和q指向的相同对象,此对象引用计数递增变为2auto r = make_shared<int>(4); // r指向的引用对象只有r一个引用者,引用计数为1
auto r = q; // 给r赋值,令它指向另一个地址// 递增q指向的对象的引用计数,此对象引用计数变为3// 递减r原来指向的对象的引用计数,此引用计数变为0,自动释放
三、实例
#include <iostream>
#include <memory> // for std::shared_ptr and std::unique_ptr class Person
{
public:Person(std::string name, int age) :m_name(name), m_age(age){std::cout << "Create Person" << " " << m_name.c_str() << " " << m_age << std::endl;};~Person(){std::cout << "Destroy Person" << " " << m_name.c_str() << " " << m_age << std::endl;};private:std::string m_name;int m_age;
};int main()
{// 离开作用域场合{// 创建shared_ptrstd::shared_ptr<Person> sharedPtr = std::make_shared<Person>("Tom", 10);// 输出引用计数( 结果:1)std::cout << "SharedPtr uses" << " " << sharedPtr.use_count() << std::endl;{// sharedPtr2和sharedPtr指向同一个对象,此对象的引用计数递增,变为2std::shared_ptr<Person> sharedPtr2 = sharedPtr; // sharedPtr2不会调用构造函数,因为这个指针和sharedPtr指向的是同一个内存地址// 输出引用计数( 结果:2)std::cout << "SharedPtr uses" << " " << sharedPtr.use_count() << std::endl;}// 当sharedPtr2离开作用域时,其指向对象的引用计数递减,变为1(此时还有sharedPtr指向该对象)。 std::cout << "SharedPtr uses" << " " << sharedPtr.use_count() << std::endl;}// 当sharedPtr离开作用域时,引用计数递减变为0。然后析构函数自动被调用,析构函数会检查 shared_ptr 的引用计数,如果计数为 0,则调用 reset 函数来释放对象(不用显示调用),并将指针设为null。std::cout << "Hello World!\n";return 0;
}
相关文章:
【C++11】shared_ptr智能指针使用详解
系列文章目录 【C11】智能指针与动态内存 文章目录 系列文章目录简介一、头文件二、初始化1. make_shared2. 拷贝和赋值 三、实例 简介 shared_ptr 是一个类的模板,它使用引用计数的方式来管理一个动态分配的内存资源。shared_ptr 需要一个动态分配的对象时&#…...
JavaScript对象
在JavaScript中,对象是一种非常重要的数据类型。它们允许我们组织和存储相关的数据,并提供了一种灵活的方式来操作和访问这些数据。本文将介绍JavaScript对象的基本概念,包括创建对象、访问对象属性、对象的方法和构造函数,以及原…...
HTML5中自定义数据属性data-*属性(3)jq如何操作data-*
HTML5中自定义数据属性(1)data-*属性(1)data-*属性的使用HTML5中自定义数据属性(2):data-*的使用HTML5中自定义数据属性data-属性(3)jq如何操作data- 在 jQuery 中,可以使用 data() 方法来获取 data-* 属性的值。这个方法可以读取或设置 HTML 元素上的 …...
C#中.NET Framework4.8 Windows窗体应用通过EF访问新建数据库
目录 一、 操作步骤 二、编写EF模型和数据库上下文 三、 移植(Migrations)数据库 四、编写应用程序 五、生成效果 前文已经说过.NET Framework4.8 控制台应用通过EF访问已经建立的和新建的数据库。 本文想说的是,.NET Framework4.8 Win…...
LuatOS-SOC接口文档(air780E)--pack - 打包和解包格式串
pack.unpack( string, format, init) 解包字符串 参数 传入值类型 解释 string 需解包的字符串 string 格式化符号 ‘<’:设为小端编码 ‘>’:设为大端编码 ‘’:大小端遵循本地设置 ‘z’:空字符串 ‘p’:byte字符串 ‘P’:word字符串 ‘a’:size_t字符串 ‘A’:…...
认知升级:模型与范式转换
你好,我是 EarlGrey,一名双语学习者,会一点编程,目前已翻译出版《Python 无师自通》、《Python 并行编程手册》等书籍。 点击上方蓝字关注我,持续获取编程干货、好书推荐和高效工具分享,一起提升认知和思维…...
【2021集创赛】Arm杯一等奖作品—基于 Cortex-M3 内核 SOC 的动目标检测与跟踪系统
本作品介绍参与极术社区的有奖征集|秀出你的集创赛作品风采,免费电子产品等你拿~ 团队介绍 参赛单位:北京理工大学 队伍名称:飞虎队 指导老师:李彬 参赛杯赛:Arm杯 参赛人员:余裕鑫 胡涵谦 刘鹏昀 获奖情况࿱…...
无线WiFi安全渗透与攻防(一) 无线安全环境搭建以及密码生成
无线WiFi安全渗透与攻防 一. 无线安全环境搭建1.802.11标准(1).概念(2). 802.11标准和补充2.WiFi标准3.无线接入点AP(Access Point)1.概念2.AP的分类(1).胖AP(2).瘦AP(3).用途的区别4.客户端 STA5.无线局域网AP术语介绍6.无线网卡的工作模式(1).Managed Mode(2).…...
Windows 11 设置 wsl-ubuntu 使用桥接网络
Windows 11 设置 wsl-ubuntu 使用桥接网络 0. 背景1. Windows 11 下启用 Hyper-V2. 使用 Hyper-V 虚拟交换机管理器创建虚拟网络3. 创建 .wslconfig 文件4. 配置 wsl.conf 文件5. 配置 wsl-network.conf 文件6. 创建 00-wsl2.yaml7. 安装 net-tools 和 openssh-server 0. 背景 …...
Java排序算法之归并排序
图解 归并排序是一种效率比较高的分治排序算法,主要分为两个步骤,分别为“分”和“并”。 分:将序列不断二分,直到每个子序列只有一个元素为止。 并:将相邻两个子序列进行合并,合并时比较两个子序列的元素…...
【Phoenix】请求的生命周期
本文的目的是讨论Phoenix请求的生命周期。我们实战添加两个新的页面,并讨论整个过程是如何串起来的。 让我们从添加第一个新页面开始。 添加一个新页面 web应用通常通过将HTTP方法和路径映射到应用的某个函数来处理请求。Phoenix通过路由器来实现这个匹配。例如将…...
Ps:利用 AI 技术创建人像皮肤图层蒙版
Photoshop 并没有提供专门选择人像皮肤的工具或命令(色彩范围中的肤色选择非常不精准),但较新版的 Camera Raw 滤镜则提供了基于 AI 技术的选择人物并创建面部和身体皮肤蒙版的功能。 如果能将 Camera Raw 滤镜中创建的 AI 皮肤蒙版转换成 Ps…...
内存泄漏、new、delete
1. 内存泄漏 内存泄漏:指针被销毁,指针指向的空间依旧存在 2. new过程 与内存分配、构造函数有关 1)分配空间:void* mem operator new( sizeof( ) ),内部调用malloc 2)static_cast<目标类型>(mem) …...
php在线审稿系统mysql数据库web结构layUI布局apache计算机软件工程网页wamp
一、源码特点 php在线审稿系统是一套完善的web设计系统mysql数据库 ,对理解php编程开发语言有帮助,系统具有完整的源代码和数据库,系统主要采用B/S模式开发。 php在线审稿系统 代码 https://download.csdn.net/download/qq_41221322/885…...
【华为HCIP | 华为数通工程师】ISIS 高频题(1)
个人名片: 🐼作者简介:一名大三在校生,喜欢AI编程🎋 🐻❄️个人主页🥇:落798. 🐼个人WeChat:hmmwx53 🕊️系列专栏:🖼️…...
Netty+SpringBoot 打造一个 TCP 长连接通讯方案
项目背景 最近公司某物联网项目需要使用socket长连接进行消息通讯,捣鼓了一版代码上线,结果BUG不断,本猿寝食难安,于是求助度娘,数日未眠项目终于平稳运行了,本着开源共享的精神,本猿把项目代码…...
2023.11.15 每日一题(AI自生成应用)【C++】【Python】【Java】【Go】 动态路径分析
目录 一、题目 二、解决方法 三、改进 一、题目 背景: 在一个城市中,有数个交通节点,每个节点间有双向道路相连。每条道路具有一个初始权重,代表通行该路段的成本(例如时间、费用等)。随着时间的变化&am…...
【libGDX】初识libGDX
1 前言 libGDX 是一个开源且跨平台的 Java 游戏开发框架,于 2010 年 3 月 11 日推出 0.1 版本,它通过 OpenGL ES 2.0/3.0 渲染图像,支持 Windows、Linux、macOS、Android、iOS、Web 等平台,提供了统一的 API,用户只需要…...
VIVADO+FPGA调试记录
vivadoFPGA调试记录 vitis编译vivado导出的硬件平台,提示xxxx.h file cant find vitis编译vivado导出的硬件平台,提示’xxxx.h file cant find’ 此硬件平台中,包含有AXI接口类型的ip。在vitis编译硬件平台时,经常会报错…...
Android——Gradle插件gradle-wrapper.properties
一、Android Studio版本,Android Gradle插件版本,Gradle版本 Android Studio 通过Android Gradle插件 使用 Gradle来构建代码; Android Studio每次升级后, Android Gradle 插件自动更新,对应的Gradle版本也会变动&…...
Python|GIF 解析与构建(5):手搓截屏和帧率控制
目录 Python|GIF 解析与构建(5):手搓截屏和帧率控制 一、引言 二、技术实现:手搓截屏模块 2.1 核心原理 2.2 代码解析:ScreenshotData类 2.2.1 截图函数:capture_screen 三、技术实现&…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
循环冗余码校验CRC码 算法步骤+详细实例计算
通信过程:(白话解释) 我们将原始待发送的消息称为 M M M,依据发送接收消息双方约定的生成多项式 G ( x ) G(x) G(x)(意思就是 G ( x ) G(x) G(x) 是已知的)࿰…...
【SpringBoot】100、SpringBoot中使用自定义注解+AOP实现参数自动解密
在实际项目中,用户注册、登录、修改密码等操作,都涉及到参数传输安全问题。所以我们需要在前端对账户、密码等敏感信息加密传输,在后端接收到数据后能自动解密。 1、引入依赖 <dependency><groupId>org.springframework.boot</groupId><artifactId...
python爬虫:Newspaper3k 的详细使用(好用的新闻网站文章抓取和解析的Python库)
更多内容请见: 爬虫和逆向教程-专栏介绍和目录 文章目录 一、Newspaper3k 概述1.1 Newspaper3k 介绍1.2 主要功能1.3 典型应用场景1.4 安装二、基本用法2.2 提取单篇文章的内容2.2 处理多篇文档三、高级选项3.1 自定义配置3.2 分析文章情感四、实战案例4.1 构建新闻摘要聚合器…...
以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
【7色560页】职场可视化逻辑图高级数据分析PPT模版
7种色调职场工作汇报PPT,橙蓝、黑红、红蓝、蓝橙灰、浅蓝、浅绿、深蓝七种色调模版 【7色560页】职场可视化逻辑图高级数据分析PPT模版:职场可视化逻辑图分析PPT模版https://pan.quark.cn/s/78aeabbd92d1...
C语言中提供的第三方库之哈希表实现
一. 简介 前面一篇文章简单学习了C语言中第三方库(uthash库)提供对哈希表的操作,文章如下: C语言中提供的第三方库uthash常用接口-CSDN博客 本文简单学习一下第三方库 uthash库对哈希表的操作。 二. uthash库哈希表操作示例 u…...
破解路内监管盲区:免布线低位视频桩重塑停车管理新标准
城市路内停车管理常因行道树遮挡、高位设备盲区等问题,导致车牌识别率低、逃费率高,传统模式在复杂路段束手无策。免布线低位视频桩凭借超低视角部署与智能算法,正成为破局关键。该设备安装于车位侧方0.5-0.7米高度,直接规避树枝遮…...
字符串哈希+KMP
P10468 兔子与兔子 #include<bits/stdc.h> using namespace std; typedef unsigned long long ull; const int N 1000010; ull a[N], pw[N]; int n; ull gethash(int l, int r){return a[r] - a[l - 1] * pw[r - l 1]; } signed main(){ios::sync_with_stdio(false), …...
