智能指针share_ptr,unique_ptr,weak_ptr。再也不要担心内存管理的问题了

C++ 智能指针unique_ptr、shared_ptr、weak_ptr详解(包含代码示例) 阅读详情

share_ptr

共享智能指针,从名字就能知道,它是一个共享的指针,也就说开辟一块堆空间,大家一起共用。
在这里插入图片描述
那我们怎么去管理这片共有的内存呢?share_ptr是一个模板类,在它里面有个成员count,专门用来记录有多少个指针同时指向了这份内存,如果有一个对象发生了析构,但是count值不为0表明还有其他对象在使用这一片内存,就不需要释放这块内存。所以这种指针一般用于多个类对象共享一块内存。
下面从debug模式观察一下整个在内存上的存储情况
在这里插入图片描述
下面给出一个特别注意的地方,如果用一个指针去初始化智能指针,这个智能指针发生析构时只是释放这个指针,并不会释放指针指向的内容。如下debug看到的情况(如果有错误欢迎指出)
在这里插入图片描述
当debug到22行时可以观察到pv地址下内存已经初始化。
在这里插入图片描述
在25行的时候明细观察到智能指针指向了pv这个地址
在这里插入图片描述
在这里插入图片描述
当执行到29行时,已经出了智能指针的作用域,我们发现pv指针指向的内容并没有被释放。但是智能指针指向的指针已经被释放。
在这里插入图片描述
执行完delete后所有内存才释放完毕。所以,如果有这样的使用情况还是值得注意的。

share_ptr相关的一些验证。

至于有关share_ptr的一些特性,可以参考C++primer,这里给出一些有趣的验证而已。
1.验证share_ptr指向同一份地址空间,当发生拷贝构造时count会增加。

shared_ptr<string> p(new string);
	p->append("abc");
	p->append("bcd");
	
	cout << (*p)[1] << endl;
	//这里使用P.xx访问成员方法时,p是作为一个对象存在的,而此时的p是存放在栈上的,而*p是将p解引用的结果,就是指针的基本用法
	cout << p.use_count() << endl;//1
	auto p2(p);//拷贝构造,数量加一;
	cout << p2.use_count() << endl;//2
	(*p)[0] = 'd';//由于share_ptr是指向同一份内存地址的,所以一个指针改变其中的内容,其余也会跟着改变,可以用在多对象共享数据
	cout << *p << endl;
	cout << *p2 << endl;
	cout << hex << p << endl;//查看指针指向的地址
	cout << hex << p2 << endl;//查看指针指向的地址

对应的输出
在这里插入图片描述
可以观察到实际的输出结果和预想的是一样的,两个只能指针都指向了014AC830这个地址。
2.验证智能指针的智能指针
我们知道指针有多级指针,不知道智能指针是否有这个呢?

shared_ptr<string> p3;
	//如果一个智能指针是一个指向智能指针的指针呢?
	{
		//让q的作用域仅限于大括号内,观察p3是否会被释放
		shared_ptr<shared_ptr<string>> q(new shared_ptr<string>(new string));
		cout << q->use_count() << endl;//1
		(*q)->append("abcdef");
		cout << (**q) << endl;//输出abcdef
		cout <<hex<<*q << endl;
		p3 =(*q);//拷贝构造
		cout << (*p3) << endl;
		cout << "---------------修改后内容------------------" << endl;
		(**q)[0] = 'g';
		cout << (*p3) << endl;//gbcdef
		cout << (**q) << endl;//gbcdef
		cout << q->use_count() << endl; //2
	}//出了括号shared_ptr<shared_ptr<string>> q析构,从而释放shared_ptr<string>,然后shared_ptr<string>自己再析构,使得count--
	cout << (*p3) << endl;
	cout << hex << p3 << endl;
	cout << p3.use_count() << endl;//1

在这里插入图片描述
可以观察到二级指针也是完全没问题的,同样解引用得到的地址和一级指针是一致的。
3.指向函数的智能指针


int add(int a, int b) {
	return a + b;
}
typedef int(*myadd)(int, int);

//指向函数的智能指针
//myadd 是一个函数指针,用add这个函数初始化myadd这个函数指针
shared_ptr<myadd> pfunc(new myadd(add));
cout << (*pfunc)(1, 2) << endl;

事实和普通的函数指针用法是一致的。

有关share_ptr的一些小结

share_ptr通过count这个值记录指针引用的个数,从而决定什么时候完全释放指针指向的对象。减少了我们对内存管理的要求,假设我们申请了某个堆对象的时候,但是我们却不是很清楚什么时候该释放它,这个时候智能指针就很有用了。

unique_ptr

uinque_ptr是一个独占式的指针,也就是说同一时刻只有一个指针能指向这个对象,如果其他的指针想进入就必须先释放之前的然后再由新的指针指向该段内容。为了实现这个效果,unique_ptr是不提供直接的拷贝构造方法,必须先release()一个当前指针,但是在release的时候必须由另一个指针接受,要不然指针被释放了,指向的内存空间没被释放会造成内存泄漏的问题。

unique_ptr<string> p1(new string("text"));
	
	unique_ptr<string> p2(p1.release());
	//cout << (*p1) << endl; //p1的指针已经被释放了
	//unique_ptr<string> p2(p1);//错误,不可以直接拷贝
	//p2.release();//不可以直接删除P2这样一来失去控制权无法析构内存
	auto p3 = p2.release();

在这里插入图片描述

weak_ptr

weak_ptr是一种不控制对象生存周期的智能指针,它指向一个有share_ptr管理的对象,当使用share_ptr初始化weak_ptr的时候share_ptr的count值不会增加,当share_ptr完全被析构的时候,weak_ptr也就相对应的失效了。所以weak_ptr是一种弱类型的指针,它不可以直接使用,必须使用lock方法返回一个share_ptr再去访问对象。

	auto q = make_shared<string>(10, '9');
	weak_ptr<string> pw(q);
	//cout << *pw << endl; //错误,不能直接访问
	//pw->push_back('a');//错误,不能直接访问
	auto p = pw.lock();
	p->push_back('a');
	if (p) {
		cout << *p << endl;
	}
【C++11】三大神器之——智能指针 在Cpp11新标准下学习C++三大神器之一的智能指针 阅读详情

相关推荐

银河麒麟V10 SP1 x86_64架构下离线部署全栈开发环境:Java8+Mysql5.7+Tomcat8实战指南

本文详细介绍了在银河麒麟V10 SP1 x86_64架构下离线部署全栈开发环境的实战指南,包括Java8、Mysql5.7和Tomcat8的安装与配置。通过步骤详解和常见问题排查,帮助开发者在国产操作系统上高效搭建稳定可靠的开发环境,特别适合政务系统和企业级应用部署。

weixin_29230901的博客 373

shared_ptr

1、方便资源的管理,自动释放没有指针引用的资源。 2、使用引用计数来标识是否有多余指针指向该资源。(shart_ptr本身指针会占1个引用) 3、在赋值操作中, 原来资源的引用计数会减一,新指向的资源引用计数会加一。   std::shared_ptr<Test> p1(new Test);   std::shared_ptr<Test> p2(...

dianyun7150的博客 268

Cisco思科 电子科技大学计算机网络 SRWE 期末技能考试 (PTSA)

电子科技大学2024春_SRWE_计算机网络系统 SRWE 期末技能考试 (PTSA)

2301_76745065的博客 5094

C++11智能指针之shared_ptr

文章目录shared_ptr创建:析构接口问题1:问题2总结: shared_ptr 第一种智能指针是shared_ptr,它有一个叫做共享所有权(sharedownership)的概念。shared_ptr的目标非常简单:多个指针可以同时指向一个对象,当最后一个shared_ptr离开作用域时,内存才会自动释放。 创建: void main( ) { shared_ptr<int> sptr1( new int ); } 使用make_shared宏来加速创建的过程。因为shared_pt

创造晴天 2282

智能手环心率检测不准?用STM32+MAX30102教你实现医疗级精度(含算法优化)

本文详细解析了如何利用STM32微控制器和MAX30102光学传感器实现医疗级精度的心率检测方案。通过硬件参数调校、ADC采集优化、运动伪影消除及深度学习算法改进,显著提升智能手环在静态和运动状态下的检测精度,误差可控制在±1.5bpm以内,满足医疗电子标准。

weixin_28335283的博客 525

Lattice FPGA 开发流程(以 ECP5 为例)

以下是以 Lattice ECP5 FPGA 为例的开发流程,涵盖从需求分析到硬件部署的完整步骤。ECP5 系列是 Lattice 提供的高性能、低功耗 FPGA,适用于通信、工业控制和嵌入式系统等领域。

u011732210的博客 1258

一篇文章说清楚shared_ptr,unique_ptr的区别和关系

一. shared_ptr的基本用法 (一)与unique_ptr的比较 比较 shared_ptr unique_ptr 备注 初始化 ①shared_ptr<T> sp; sp.reset(new T()); ②shared_ptr<T> sp(new T()); ③shared_ptr<T> sp1 = sp;//拷贝...

肖邦的夜曲的专栏 1万+

基于企业微信客服与GPT-3构建合规微信AI助手:从原理到部署实践

在人工智能与即时通讯融合的浪潮中,自然语言处理(NLP)与API集成成为构建智能对话系统的核心技术。其原理在于通过API网关接收用户输入,调用云端大语言模型进行处理,再将结果返回给用户,实现自动化交互。这项技术的核心价值在于将前沿AI能力无缝嵌入到日常高频应用场景中,极大地提升了客服自动化、智能问答与个性化服务的效率与体验。企业微信作为官方认可的企服平台,其开放的客服API接口为开发者提供了稳定、合规的消息通道,是连接微信生态与外部AI服务的理想桥梁。本文聚焦于如何利用企业微信客服API与OpenAI的GP

weixin_28727943的博客 627

shared_ptr和unique_ptr区别和联系

shared_ptr 和 unique_ptr区别和联系 shared_ptr 和 unique_ptr区别和联系 shared_ptr 类 shared_ptr 和 unique_ptr 共有操作 shared_ptr 独有操作 make_shared 函数 unique_ptr 类 unique_ptr 独有操作 示例程序: 头文件 C++11 版本出现了很多技术,要学...

MissXy_的博客 3万+

避坑指南:大疆智图集群建模中5个90%新手会踩的雷(附错误日志分析)

本文针对大疆智图集群建模功能,总结了新手在部署和运行时极易遇到的五个常见问题,包括共享目录权限与路径、主从节点版本一致性、临时存储路径设置、网络与防火墙配置以及错误日志分析。文章结合具体错误日志,提供了详细的排查步骤和解决方案,旨在帮助用户快速定位并解决问题,充分发挥集群建模的效率优势。

weixin_29238147的博客 335

FTU电科院检测学习笔记-规划

如果写到最后,还非常的有动力和兴趣,可能会举出一些特定的例子来,但不保证一定是这样。

sixtome 1098

(C++) 手写智能指针(unique_ptr;share_ptr)

RAII资源获取即初始化 C++11更是弥补了auto_ptr的缺陷,提出了unique_ptr,share_ptr,weak_ptr 注意智能指针的本质就是一个模板类,通过类的内部的操作,来管理资源 本文简单实现了一下

cuber-lotus的博客 1885

Python控制LitePoint IQxel-MW 无线网络测试仪

由于项目需要进行WIFI和BT(蓝牙)的射频测试,所以需要开发一款支持WIFI/BT射频测试的工具。开发射频测试工具的话那肯定离不开仪表的控制。我们项目用的就Litepoint的IQxel-MW无线网络测试仪。这篇文章主要就是介绍一下如何控制仪表以及实现的过程!LitePoint是美国硅谷的一家仪器厂商,主要做一些无线通讯测试仪表,包括WIFI,BT(Bluetooth),LTE等等。

xgh1951的博客 1万+

《 C++ 修炼全景指南:十五 》智能指针大揭秘:从 auto_ptr 到 unique_ptr & shared_ptr 的进化之路

本文全面探讨了 C++ 智能指针的三种主要类型:auto_ptr、unique_ptr 和 shared_ptr。我们将详细分析它们的设计理念、特点以及优缺点。auto_ptr 作为早期的智能指针,由于其所有权转移特性已在 C++11 被废弃。unique_ptr 提供独占所有权,避免了资源冲突并且性能开销较小。shared_ptr 支持多个指针共享同一资源,但可能导致性能开销和循环引用问题。通过自定义实现和代码示例,本文帮助读者深入理解这些智能指针的内部机制及其在实际开发中的应用。

Lenyiin 1816

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

C++智能指针详解

智能指针的使用细节

Albert_weiku的博客 5483

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

C++智能指针:unique_ptr与shared_ptr的内存管理原理与实践指南

内存管理是编程语言中的核心概念,它涉及程序运行时对计算机内存资源的分配、使用和释放。在C++等系统级语言中,手动内存管理容易导致内存泄漏、悬空指针等问题,严重影响程序稳定性。RAII(资源获取即初始化)是一种重要的编程范式,通过将资源生命周期与对象绑定,实现自动资源管理。智能指针技术正是基于RAII理念,在C++中提供了安全、自动的内存管理机制。其技术价值在于将开发者从繁琐且易错的手动内存管理中解放出来,提升代码健壮性和可维护性。在实际工程中,智能指针广泛应用于需要动态内存管理的场景,如对象池、缓存系统、异

weixin_33694620的博客 455

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

C11 的智能指针(shared_ptr,weak_ptr)

一:概述 参考资料:《C++ Primer中文版 第五版》 我们知道除了静态内存和栈内存外,每个程序还有一个内存池,这部分内存被称为自由空间或者堆。程序用堆来存储动态分配的对象即那些在程序运行时分配的对象,当动态对象不再使用时,我们的代码必须显式的销毁它们。 在C++中,动态内存的管理是用一对运算符完成的:new和delete,new:在动态内存中为对象分配一块空间并返回一个指向该对象的指针,delete:指向一个动态独享的指针,销毁对象,并释放与之关联的内存。 动态内存管理经常会出现两种问题:一种是

jusu10的博客 901

C++高级特性:独享智能指针unique_ptr(二)

C++11中通过引入智能指针的概念,使得C++程序员不需要手动释放内存。先准备一个Cat.h和一个Cat.cpp,如下。

weixin_43808717的博客 1418

C++智能指针:auto_ptr, unique_ptr, shared_ptr, weak_ptr

shared_ptr 是为了解决 auto_ptr 在对象所有权上的局限性(auto_ptr 是独占的), 在使用引用计数的机制上提供了可以共享所有权的智能指针。比如B对象中有一个方法print(),我们不能这样访问,pa->pb_->print(),因为pb_是一个weak_ptr,应该先把它转化为shared_ptr。如果把其中一个改为weak_ptr就可以了,我们把类A里面的shared_ptr pb_,改为weak_ptr pb_ ,运行结果如下。当计数等于0时,资源会被释放。

小鹏AI 193

C++智能指针再理解

C++指针指针的重新理解和unique_ptr的简单实现

默示MoS的博客 889

【C++】C++的内存处理 --- 智能指针

本文探讨了C++智能指针的原理与应用,分析了传统异常机制中内存泄漏问题,并提出智能指针的解决方案。文章详细介绍了RAII技术、shared_ptr、unique_ptr和weak_ptr的使用,并演示了如何通过自定义删除器来适配不同的资源释放需求。同时,文章还提及了多线程环境下智能指针的安全性和内存泄漏问题,强调智能指针在预防内存泄漏中的重要作用,为C++开发者提供了实用的内存管理指南。

叫我龙翔的博客 1584

【C++11新特性】详解智能指针 创建、使用、注意事项

C++11 中引入了智能指针,便于进行内存管理 使用智能指针 需要包含头文件:#include 以及 std 命名空间 智能指针会自动回收空间,不需要担心内存泄漏问题 四种智能指针: auto_ptr(C++11 被弃用) unique_ptr shared_ptr weak_ptr 一、 auto_ptr 创建auto_ptr对象的三种方式:

努力让自己的能力配得上梦想. 2173

C++:智能指针

RAII是什么? RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。 智能指针(std::shared_ptr和std::unique_ptr)即RAII最具代表的实现,使用智能指针,可以实现自动的内存管理,再也不需要担心忘记delete造成的内存泄漏。毫不夸张的来讲,有...

赫菲斯托斯,, 943

智能指针 【C++】

智能指针【C++】 RALL机制:资源获取即初始化,使用==局部对象==来管理资源的技术(这里的资源主要指操作系统中有限的:比如内存、网络套接字、互斥量、文件句柄等,局部对象是指存储在栈的对象,其生理周期有操作系统来管理) 1、使用裸指针存在的问题 在使用时,我们无法判断它指向的是一个对象还是一组对象。 int *tmp;//野指针 int *op=NULL;//空指针 //从堆区new出来的指针之后释放了,叫失效指针(或悬空指针) 无法判断一个使用完后的指针是否应该被销毁,因为无法判断指针此时还

zypf_lover的博客 781

C++中的智能指针与内存管理技巧

智能指针是一种强大的工具,可以帮助程序员自动管理内存,减少内存泄漏和悬挂指针的风险。智能指针是一种封装了原始指针的对象,它提供了自动内存管理的功能。当智能指针对象超出作用域或被销毁时,它会自动释放所指向的内存。用于解决循环引用问题,即两个对象相互引用,导致它们的引用计数永远不会减少到0,从而无法自动删除。C++中的智能指针是一种强大的工具,可以帮助程序员自动管理内存并减少内存泄漏的风险。等智能指针类型,并遵循一些关键的内存管理技巧,我们可以编写出更安全、更可靠的C++代码。是一种共享所有权的智能指针。

anananwc的博客 545

独占指针 std::unique_ptr

unique_ptr 智能指针的使用方法

debug... 1970
上一篇: C++与C# 采用socket 在进程间进行通信。
下一篇: static_cast,onst_cast,dynaminc_cast reinterpret_cast
邓文尧
博客等级 码龄8年 57粉丝 39原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值