【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版本也会变动&…...
Qwen3-14B GPU算力优化实践:显存占用降低28%的FlashAttention-2配置
Qwen3-14B GPU算力优化实践:显存占用降低28%的FlashAttention-2配置 1. 开箱即用的私有部署方案 对于想要快速部署Qwen3-14B大模型的企业和个人开发者来说,这个经过优化的私有部署镜像提供了完美的解决方案。它基于RTX 4090D 24GB显存显卡和CUDA 12.4环…...
【C++:哈希表】从哈希冲突到负载因子:深入探索开放定址与链地址法的核心机密
🔥小叶-duck:个人主页 ❄️个人专栏:《Data-Structure-Learning》《C入门到进阶&自我学习过程记录》 《算法题讲解指南》--优选算法 《算法题讲解指南》--递归、搜索与回溯算法 《算法题讲解指南》--动态规划算法 ✨未择之路࿰…...
3步打造B站高效体验:开源客户端的极致优化指南
3步打造B站高效体验:开源客户端的极致优化指南 【免费下载链接】BiliBili-UWP BiliBili的UWP客户端,当然,是第三方的了 项目地址: https://gitcode.com/gh_mirrors/bi/BiliBili-UWP BiliBili-UWP作为一款开源客户端,专为Wi…...
Pixel Epic实战案例:用AgentCPM-Report 3步生成逻辑严密深度研报
Pixel Epic实战案例:用AgentCPM-Report 3步生成逻辑严密深度研报 1. 引言:当研究报告遇上像素冒险 想象一下这样的场景:你需要完成一份关于新能源行业的深度研究报告,传统方式可能需要花费数周时间收集资料、分析数据、撰写内容…...
Splunk Enterprise 10.2.2 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台
Splunk Enterprise 10.2.2 (macOS, Linux, Windows) - 搜索、分析和可视化,数据全面洞察平台 Search, analysis, and visualization for actionable insights from all of your data 请访问原文链接:https://sysin.org/blog/splunk-10/ 查看最新版。原…...
终极Windows 11优化指南:Win11Debloat让你的系统重获新生
终极Windows 11优化指南:Win11Debloat让你的系统重获新生 【免费下载链接】Win11Debloat A simple, lightweight PowerShell script that allows you to remove pre-installed apps, disable telemetry, as well as perform various other changes to declutter and…...
颠覆级植物大战僵尸修改工具:一站式资源管理与战局掌控解决方案
颠覆级植物大战僵尸修改工具:一站式资源管理与战局掌控解决方案 【免费下载链接】pvztoolkit 植物大战僵尸 PC 版综合修改器 项目地址: https://gitcode.com/gh_mirrors/pv/pvztoolkit 还在为植物大战僵尸中阳光不足而焦虑吗?面对海量僵尸浪潮却束…...
EnergyStarX深度解析:开源开发者如何让Windows 11续航提升40%+
EnergyStarX深度解析:开源开发者如何让Windows 11续航提升40% 【免费下载链接】EnergyStarX 🔋 Improve your Windows 11 devices battery life. A WinUI 3 GUI for https://github.com/imbushuo/EnergyStar. 项目地址: https://gitcode.com/gh_mirror…...
HCPL-0700-000E,低输入电流、高增益且与高安全隔离性能的光耦
型号介绍今天我要向大家介绍的是 Broadcom 的光耦——HCPL-0700-000E。它的内部结构就像一个高效的“信号转换站”,结合了一个发光二极管和一个集成的高增益光子探测器。光电二极管和输出级采用独立引脚设计,当输入端接收到电流时,LED 会发出…...
零基础入门AI集成:在快马平台编写你的第一个豆包AI对话程序
零基础入门AI集成:在快马平台编写你的第一个豆包AI对话程序 作为一个刚接触AI开发的新手,第一次看到豆包开放平台的API文档时,我完全被各种参数和术语搞晕了。好在发现了InsCode(快马)平台,它让我不用从零开始写代码就能理解整个…...
