[C++] 初识 智能指针

news2024/11/16 7:45:12

标题:[C++] 初识 智能指针

@水墨不写bug



目录

一、前言

二、智能指针

1. 什么是RAII?

2.智能指针分类

 三、智能指针简介

1.std::auto_ptr

2.std::unique_ptr

3.std::shared_ptr


正文开始:

一、前言

        C++智能指针的出现是有一定的背景的:

        Java有专属的GC(垃圾回收功能),这样一来可以在一定程度上解放解放程序员的关于内存方面的思考与手动设计,但GC等特点也是Java相对于C++效率较低的原因。在使用C++编程时,需要时刻注意内存的管理,但是尽管我们时刻都记得要注意内存的管理逻辑,在有一些场景,内存泄漏时有发生,比如下边这样的一个场景:

#include<iostream>
#include<string>
using namespace std;

double div(double a, double b)
{
	if (b == 0)
		throw string("div by zero");
	return a / b;
}
void func()
{
	int* parr1 = new int[10];   // 一
	int* parr2 = new int[10];   // 二

	//...
	double a, b;
	cin >> a >> b;
	cout << div(a,b) << endl;   // 三
	delete[] parr1;
	delete[] parr2;
}
int main()
{
	try {
		func();
	}
	catch (string s)
	{
		cout << s << endl;
	}
	catch (...)
	{
		cout << "unknown err" << endl;
	}
	return 0;
}

        在上述场景中,有三个地方可能会抛出异常:如果一处抛异常——则不用释放空间;如果二处抛异常——则需要只释放parr1;如果三处抛异常——则需要释放parr1和parr2。

        这些逻辑比较复杂,为了处理这些场景下复杂的内存管理,C++引入了智能指针。

二、智能指针

1. 什么是RAII?

           C++中的RAII(Resource Acquisition Is Initialization,资源获取即初始化)是一种资源管理技术,它的核心思想是将资源的获取(Acquisition)与对象的初始化(Initialization)结合起来,并通过对象的生命周期来管理资源的使用期。一旦对象被创建,资源就被自动获取;当对象生命周期结束时(例如,对象被销毁时),其析构函数会自动释放或归还资源

借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:


        1.不需要显式地释放资源。
        2.采用这种方式,对象所需的资源在其生命期内始终保持有效
 

         智能指针的实现思路及原理就是RAII的思想。


2.智能指针分类

         目前常用的智能指针有如下几种:

        std::auto_ptr:C++98版本的库中就提供了auto_ptr的智能指针。(不建议使用)
        std::unique_ptr:unique_ptr的实现原理:简单粗暴的防拷贝。
        std::shared_ptr:C++11中开始提供更靠谱的并且支持拷贝的shared_ptr。

 三、智能指针简介

        其实智能指针的基本原理的实现并不困难,就是把一个指针类中,写好构造和析构就可以正常使用了——当前函数栈桢退出,局部变量就会自动销毁。不同的是不同智能指针对于拷贝构造和赋值重载的处理是不同的,而其他接口的处理基本是相同的。

1.std::auto_ptr

        auto_ptr的实现原理:管理权转移。

        std::auto_ptr是比较老的智能指针类型,它可以拷贝构造,但是拷贝构造不是意味着构造了一个新的指针,而是将管理权转移到了新的指针;赋值重载会把原资源释放,把新资源转移到被赋值的指针中。


#include<memory>
#include<iostream>
using namespace std;
int main()
{
	auto_ptr<int> ap(new int[10]);
	auto_ptr<int> ap1(ap);

	if (ap.get() == nullptr)
		cout << "权限转移:ap->ap1" << endl;

	auto_ptr<int> ap2;
	ap2 = ap1;
	if(ap1.get() == nullptr)
		cout << "权限转移:ap1->ap2" << endl;

	return 0;
}
权限转移:ap->ap1
权限转移:ap1->ap2

 


2.std::unique_ptr

        unique_ptr的实现原理:简单粗暴的防拷贝。

        强行将赋值重载和拷贝构造设置为 无法调用:具体可能是 直接加上 = delete ;或者是只声明不实现,并且放在私有。
        其余部分接口的使用与auto_ptr 基本一致。

 


3.std::shared_ptr

        shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。

引用计数原则: 

         1. shared_ptr在其内部,给每个资源都维护了着一份计数p_count,用来记录该份资源被几个指针维护。
        2. 在对象(指针)被销毁时(也就是析构函数调用时),就说明这个对象(指针)不维护该资源了,对象的引用计数减一。
        3. 如果引用计数减到0,就说明自己是最后一个使用该资源的对象,必须释放该资源;
        4. 如果不是0,就说明除了自己还有其他对象在使用该份资源,不能释放该资源,否则其他对象就成野指针了。

         shared_ptr由于通过引用计数实现,其使用方法最接近普通指针,所以这里不再举例如何使用。我们仅仅需要对其几个常用接口熟悉即可。

 std::shared_ptr文档


对于以上的三种智能指针,其底层实现我们暂时不涉及,本篇只设计其思想与使用方法。 


完~

未经作者同意禁止转载 

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

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

相关文章

shell程序设计入门(三)

shell程序设计入门&#xff08;三&#xff09; 导语命令简单命令break:命令continueechoevalexecexitexprprintfreturnshift 复杂指令.exportsetunsettrapfindgrep 总结参考文献 导语 本篇介绍一些shell中常用的复杂命令及其使用&#xff0c;如set、echo、expr等命令 命令 简…

【每日一题】【区间合并】【贪心 模拟】多米诺骨牌 牛客小白月赛99 E题 C++

牛客小白月赛99 E题 多米诺骨牌 题目背景 牛客小白月赛99 题目描述 样例 #1 样例输入 #1 3 6 1 1 1 1 3 2 1 4 3 2 7 9 11 6 2 1 1 1 3 2 1 4 3 2 7 9 11 5 4 1 4 1 1 2 1 2 3 6 8样例输出 #1 3 6 5做题思路 按照玩多米诺骨牌的方式。 先将多米诺骨牌按照骨牌位置从小…

ai伴学之“修图”

偶一张孩子专注的抓拍&#xff0c;通过与ai探讨修图心得让做图理念更完备。 (笔记模板由python脚本于2024年08月25日 18:23:49创建&#xff0c;本篇笔记适合喜欢搞图的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.org/ Free&#xff1a…

JAVA_10

JAVA_10 JAVA异常机制及bug追踪1. 异常 JAVA异常机制及bug追踪 1. 异常 英文:Exception 所谓异常处理&#xff0c;就是指程序在出现问题时依然可以正确的执行完。Java面向对象处理异常过程 抛出异常:在执行一个方法时&#xff0c;如果发生异常&#xff0c;则这个方法生成代表…

Layer-refined Graph Convolutional Networks for Recommendation【ICDE2023】

Layer-refined Graph Convolutional Networks for Recommendation 论文&#xff1a;https://arxiv.org/abs/2207.11088 源码&#xff1a;https://github.com/enoche/MMRec/blob/master/README.md 摘要 基于图卷积网络&#xff08;GCN&#xff09;的抽象推荐模型综合了用户-项目…

Chainlit接入FastGpt接口完美对接,实现全新的用户聊天界面

前言 由于fastgpt只提供了一个分享用的网页应用&#xff0c;网页访问地址没法自定义&#xff0c;虽然可以接入NextWeb/ChatGPT web等开源应用。但是如果我们想直接给客户应用&#xff0c;还需要客户去设置配置&#xff0c;里面还有很多我们不想展示给客户的东西怎么办&#xf…

# 利刃出鞘_Tomcat 核心原理解析(九)-- Tomcat 安全

利刃出鞘_Tomcat 核心原理解析&#xff08;九&#xff09;-- Tomcat 安全 一、Tomcat专题 - Tomcat安全 - 配置安全 1、 删除 tomcat 的 webapps 目录下的所有文件&#xff0c;禁用 tomcat 管理界面. 如下目录均可删除&#xff1a; D:\java-test\apache-tomcat-8.5.42-wind…

轻松实现PDF转图片!2024四大实用工具推荐!

有时候我们需要将PDF文件中的内容转换为图片格式&#xff0c;以便在不同的平台和设备上更好地展示和分享。"PDF转图片"这一需求催生了众多转换工具的出现&#xff0c;它们以高效、便捷的服务帮助用户轻松实现格式转换。 福昕PDF转换大师&#xff08;365客户端&#…

JAVA Future类详解

在编程中&#xff0c;Java中的"Future"是一个接口&#xff0c;代表是作为主线程开辟的一个分支任务&#xff0c;处理耗时的业务&#xff0c;并且可以可以为主线程最终返回异步计算的结果。此外&#xff0c;它提供了检查计算是否完成&#xff0c;等待其完成&#xff0…

ISP 3A 算法:自动曝光(AE)中的平均亮度法详解

在自动曝光&#xff08;AE&#xff09;算法中&#xff0c;平均亮度法是一种经典且广泛应用的技术。它通过计算场景中所有像素的平均亮度来确定最佳曝光设置&#xff0c;从而保证图像的整体亮度处于适当的水平。尽管该方法相对简单&#xff0c;但它在AE算法中扮演着重要的角色&a…

仕考网:专科考公好考吗?有岗位吗?

2024年&#xff0c;国家公务员以及大多数省市的公务员考试接受至少拥有大专学历的考生。某些特定职位&#xff0c;例如上海市和北京市的岗位&#xff0c;可能要求考生必须持有本科或以上学历才能参与考试。 属于国家公务员考试、省直属单位、市直属单位以及中央直属单位的职位…

奥斯卡影后斯特里普和马丁肖特在最近的这次约会后再次引发热议

奥斯卡影后斯特里普和马丁肖特在最近的这次约会后再次引发热议 2024-08-24 00:00 发布于&#xff1a;河北省 自从梅丽尔斯特里普于 2023 年与相恋多年的丈夫分手以来&#xff0c;媒体对她的关注度只增不减。毕竟&#xff0c;这是好莱坞最著名的女演员 40 多年来第一次单身&…

手机投屏到电脑显示(Android -> win11)

文章目录 1.电脑安装“无线显示”功能2.系统->投影到此电脑3.手机进入无线投屏功能更 1.电脑安装“无线显示”功能 选择 “开始 ”> “设置 ”> “系统 > 投影到此 PC ”。 在 Add the ‘Wireless Display’ optional feature to project to this PC &#xff08;…

ELK进阶-安全认证设置流程介绍

目录 一、前言 二、ElasticSearch的安全认证配置 设置ElasticSearch的安全认证功能&#xff08;最低&#xff09; 启用TLS/SSL加密通信 &#xff08;1&#xff09;生成CA证书 &#xff08;2&#xff09;生成transport证书 &#xff08;3&#xff09;生成http证书 &#…

小米汽车每台亏6万,背后的认知格局

最近&#xff0c;小米汽车传出一则新闻&#xff1a;一台车亏损了6万块钱。这则消息一出&#xff0c;遭到了同行车企负责人的谩骂&#xff0c;并对雷军进行了直接攻击。对方指责雷军&#xff1a;“你亏损6万块钱还卖车干什么&#xff1f;你就是因为不亏卖不掉&#xff0c;所以才…

宠物毛发不除对身体有什么危害?除毛好的小型空气净化器分享

身为呼吸科医生&#xff0c;我亲眼见证过不少因环境因素导致的呼吸问题。在享受养猫乐趣的同时&#xff0c;我也时刻关注着它们可能带来的健康隐患&#xff0c;尤其是毛发中的细菌问题。我发现&#xff0c;不少年轻人对宠物毛发可能携带的细菌威胁缺乏足够认识。今天&#xff0…

golang多版本管理工具g

一、golang多版本管理工具g 一&#xff09;g简介 g是一个Linux、macOS、Windows下的命令行工具&#xff0c;可以提供一个便捷的多版本go环境的管理和切换 二&#xff09;g特性 支持列出可供安装的go版本号支持列出已安装的go版本号支持在本地安装多个go版本支持卸载已安装的go…

数据缓存软件Redis推出Redis 8 这更改许可证后首个重大版本更新

2024 年 3 月流行的数据库缓存应用 Redis 宣布修改开源许可证&#xff0c;此次修改许可证的目的本质上就是避免大型云计算公司白嫖&#xff0c;例如亚马逊的 AWS 等。AWS 等云计算服务商基于 Redis 推出托管服务并向客户收费&#xff0c;作为开发商 Redis 并没有获得收益&#…

还没做过电子版招生简章的老师看过来!

随着科技的不断发展&#xff0c;传统的招生简章逐渐走向数字化&#xff0c;电子版招生简章以其便捷、环保、可更新等优势&#xff0c;越来越受到各学校的青睐。如果你还不会制作电子版招生简章&#xff0c;那就赶紧来看看这篇文章吧&#xff01; 一、电子版招生简章的优势 1. …

【PHP入门教程】PHPStudy环境搭建+composer创建项目

文章目录 PHP 的历史PHP 的用途PHP 的特点和优势PHP 环境搭建环境准备安装window 安装CentOS / Ubuntu / Debian 安装 第一个Hello World使用Apache服务运行命令行运行代码 Composer安装 Composer&#xff1a;安装途中报错解决&#xff1a;初始化项目创建文件最终文件目录Compo…