C++智能指针的使用

C++中智能指针的设计和使用 智能指针(smart pointer)是存储指向动态分配(堆)对象指针的类,用于生存期控制,能够确保自动正确的销毁动态分配的对象,防止内存泄露。它的一种通用实现技术是使用引用计数(reference count)。智能指针类将一个计数器与类指向的对象相关联,引用计数跟踪该类有多少个对象共享同一指针。每次创建类的新对象时,初始化指针并将引用计数置为1;当对象作为另一对象的副本而创建时,拷贝构造函数拷 阅读详情

C++智能指针的使用

C++11中提供了三种智能指针(unique_ptr、shared_ptr、weak_ptr)来自动回收堆分配的对象。

unique_ptr

unique_ptr如它的名字所传达的意思,其所指向的内存区不能与unique_ptr定义的另一个指针共享。看代码比较容易理解。

#include <memory>
#include <iostream>
using namespce std;
int main(){
	unique_ptr<int> p1(new int(11));
	unique_ptr<int> p2 = p1;  //不能通过编译
}

p1为unique_ptr类型指针,其不能与p2共享同一片内存区域。
当然也可以用标准库的move函数显式的将“所有权”转移给另一个unique_ptr指针,但原来的指针名将不能再使用。

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

int main(int argc, char** argv)
{
	unique_ptr<int> p1(new int(11));
	unique_ptr<int> p2 = move(p1);//用move函数进行“所有权”转移
    cout << *p1 << endl;//能编译通过,但运行时报Segmentation fault错误
    cout << *p2 << endl;
    p2.reset();//可以显式地进行内存释放。
    p2.reset();//多次释放也不会报错
}

可以看到“所有权”已经被转移走的p1已经不能用*来获取存储值了。另外需要注意的一点是,unique_ptr定义的指针可以不用自己来释放内存。但也可以自己显式地用reset释放内存,而且多次释放也不会报错。

shared_ptr

shared_ptr相对于unique_ptr来说最主要的区别是它可以共享指针,可以多个指针变量指向一片共同的存储区。

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

int main(int argc, char** argv)
{
	shared_ptr<int> sp1(new int(11));
	shared_ptr<int> sp2 = sp1;//可以正常进行赋值
    cout << *sp1 << endl;//可以正常输出
    cout << *sp2 << endl;//可以正常输出
    sp1.reset();
    // sp2.reset();
    // cout << *sp1 << endl;
    cout << *sp2 << endl;
}

可以看到上面虽然用reset显式地释放了sp1指向的内存。但实际上并没有真正释放其指向的内存。因为sp2依然可以正常访问。可以想象,共享指针内部实现了一个计数,只有指向该内存空间的所有共享指针都进行了释放操作,该内存才真正释放。这避免了普通指针进行多次释放引发的错误。

weak_ptr

weak_ptr可以指向shared_ptr指针指向的对象内存,但并不拥有该内存。使用weak_ptr的lock成员函数可返回其指向内存的一个shared_ptr对象,且在所指对象已经无效时,返回指针空值(nullptr)。这在验证share_ptr智能指针的有效性上会很有作用。

#include <iostream>
#include <memory>
using namespace std;
void Check(weak_ptr<int> & wp)
{
    shared_ptr<int> sp = wp.lock(); //转换为shared_ptr<int>
    if(sp !=  nullptr)
    {
        cout << "still " << *sp << endl;
    }
    else
    {
        cout << "pointer is invalid." << endl;
    }
}
int main(int argc, char** argv)
{
	shared_ptr<int> sp1(new int(22));
	shared_ptr<int> sp2 = sp1;  
    weak_ptr<int> wp = sp1;//指向shared_ptr<int>所指的对象
    cout << *sp1 << endl;
    cout << *sp2 << endl;
    Check(wp); //still 22
    sp1.reset();
    cout << *sp2 << endl;
    Check(wp); //still 22
    sp2.reset();
    Check(wp);//pointer is invalid.
}

当对sp1和sp2都调用了reset函数。这样导致对唯一的堆内存对象的引用计数降至0。一旦引用计数变成0后,shared_ptr<int>就会释放堆内存空间,指针就会失效。此时再调用weak_ptr的lock函数时就会返回一个指针空值nullptr。而Check函数则会打印pointer is invalid.

关注公众号《首飞》回复“机器人”获取精心推荐的C/C++,Python,Docker,Qt,ROS1/2,机器人学等机器人行业常用技术资料。

C++智能指针以及我们为什么要使用智能指针 简单介绍两种智能指针,以及说明我们为什么要使用智能指针。 阅读详情

相关推荐

C++智能指针使用详解

shared_ptr对象能够初始化实际指向一个地址内容而weak_ptr对象没办法直接初始化一个具体地址,它的对象需要由shared_ptr去初始化weak_ptr不会影响shared_ptr的引用计数,因为它是一个弱引用,只是一个临时引用指向shared_ptr。即使用shared_ptr对象初始化weak_ptr不会导致shared_ptr引用计数增加。依此特性可以解决shared_ptr的循环引用问题。

程序猿老樊的博客 3123

C++智能指针的用法(全)

unique_ptr 可用于管理 new 出来的动态对象,也可以管理其他需要手动关闭的资源。例如:文件对象。由于 unique_ptr 默认使用 delete、delete[] 来释放被管理的资源。所以,当管理的对象不能通过 delete、delete[] 来释放时,就需要自定义删除器。public:Person(){cout << "构造函数" << endl;~Person(){cout << "析构函数" << endl;cout << "文件被自动关闭" << endl;if (fp!

qq_74811378的博客 2260

腾讯股票接口API(1)——根据股票代码获取详情

获取股票简要信息,找来找去也没有找到官方的文档,都是复制粘贴的,这里先简单记录一下。 1.简要信息 以贵州茅台为例: http://qt.gtimg.cn/q=s_sh600519 // sh600519是贵州茅台的股票代码,根据自己的关键字拼接URL 可以直接在Android项目中请求,会得到如下一串字符串: v_s_sh600519="1~贵州茅台~600519~2075.95~42.95~2.11~38930~794942~~26078.04~GP-A"; 这里v_s代表简要信息,sh600519

GeofferySun的专栏 6万+

c++智能指针用法

智能指针一共有4个,分别是shared_ptr,unique_ptr,weak_ptr,auto_ptr,最后一个被弃用了,主要是前面三种。作用是自动回收内存,不需要是delete,原理是智能指针内部有个计数器,每当创建一次对象计数加一,销毁一次计数减一,当计数等于0时自动释放对象。

ljjjjjjjjjjj的博客 1830

ESP-SR实战:从零搭建智能语音唤醒与命令识别系统

本文详细介绍了如何利用乐鑫ESP-SR框架,从零开始搭建一个完整的离线智能语音交互系统。内容涵盖硬件选型(推荐ESP32-S3与数字麦克风)、开发环境配置(ESP-IDF与ESP-ADF),并深入解析了AFE声学前端、WakeNet唤醒词检测和MultiNet命令词识别三大核心模块的工作原理与实战配置。通过具体的代码示例和调试技巧,指导开发者快速实现高识别率的语音唤醒与命令控制功能。

weixin_29161785的博客 301

数字IC后端时钟树综合实战:OCC电路优化与时钟树平衡策略

本文深入探讨了数字IC后端设计中时钟树综合的关键挑战,重点分析了OCC电路时钟树优化的必要性。通过实战案例,详细阐述了如何通过手动干预、时钟分组与分段长树等策略,避免工具自动平衡导致的时序违例和资源浪费,从而有效实现时钟树平衡并提升设计质量。

weixin_29306261的博客 326

C++ 中智能指针的用法

C++的智能指针的用法(有具体的C++代码示例)

m0_51913750的博客 1716

EXCEL VBA从入门到精通 前言

本书通过丰富的实例和案例,帮助读者更好地理解和应用Excel VBA编程,同时也介绍了常用的工具、资源、社区和协作平台等,方便读者进行进一步的学习和开发。我强烈推荐这本书给所有希望学习和掌握Excel VBA编程的读者。多样化的资源和工具介绍:本书介绍了丰富的工具和资源,包括官方文档、在线教程、代码库、论坛、博客等,方便读者进行进一步的学习和开发。详细的讲解和丰富的示例:本书从语法和对象开始讲解,通过丰富的实例和案例,帮助读者更好地理解和应用Excel VBA编程。第一节:什么是VBA 5。

1728

C++智能指针基础用法详解

智能指针是C++中用于管理动态分配资源的强大工具,通过正确使用智能指针,可以显著减少内存泄漏的可能性,并提高代码的安全性和可维护性。

mahuifa的博客 1926

2024年CSP-X复赛真题题解(T1:购物)

2024年CSP-X复赛真题题解(T1:购物)

王老师青少年编程 1180

MNI152 坐标空间和 fsaverage 坐标空间相互转换, 如已知fsaverage空间的坐标如何求MNI152 坐标?aparc.a2009s.annot转化到MNI152空间?

大多数神经影像学研究的结果是在体积(例如,MNI152)或表面(例如,fsaverage)坐标系中报告的。体积坐标系和表面坐标系之间的准确映射可以促进许多应用,例如将 fMRI 组分析从 MNI152 投影到 fsaverage 以进行可视化或从 fsaverage 投影静息状态 fMRI 分区对 MNI152进行新数据的体积分析。Wu et al., 2018 评估了三种在 MNI152通过模拟上述应用的 Colin27 和 fsaverage 坐标系:将组平均数据从 MNI152/Colin27 投影到

从事脑科学核磁共振方法学研究,在Nature communications等权威期刊发表研究论文,熟练掌握磁共振处理方法和统计学方法,欢迎大家和我交流。 2966

cpp智能指针的原理与使用

智能指针不是指针,是一个管理指针的类,用来存储指向动态分配对象的指针,负责自动释放动态分配的对象,防止堆内存泄漏和空悬指针等等问题。动态分配的资源,交给一个类对象去管理,当类对象声明周期结束时,自动调用析构函数释放资源。智能指针的历史历程:C++ 98 中产生了第一个智能指针auto_ptr。C++boost给出了更加实用的scoped_ptr(防止拷贝) 和 shared_ptr(引进引用计数) 和 weak_ptr。

菜一头包的博客 1216

杰理AC696N使用ADC检测电位器调音量教程

本教程详细介绍了在杰理AC696N芯片上使用ADC功能检测电位器电压值的方法。主要内容包括:硬件连接方式(电位器VCC/OUT/GND分别接3.3V、PA3引脚和地线),10位ADC配置(0-1023对应0-3.3V),以及核心代码实现。关键步骤涉及ADC采样通道初始化、GPIO引脚配置(关闭数字输入和上下拉电阻),以及通过定时器实现50Hz采样频率。教程还详解了ADC值到系统音量的线性映射算法,并提供了完整的代码示例和调试方法,帮助开发者实现电位器实时控制音量的功能。

qq_42014563的博客 1245

【C++进阶】智能指针的使用及其原理

本文介绍了C++智能指针的使用场景、设计思路及标准库实现。主要内容包括: 通过异常处理案例展示内存泄漏问题,说明智能指针的必要性; 提出RAII(资源获取即初始化)设计思想,利用对象生命周期管理资源; 设计简易智能指针类,实现资源自动释放和指针行为模拟; 分析智能指针拷贝问题,对比标准库的auto_ptr、unique_ptr等解决方案; 重点指出auto_ptr存在管理权转移缺陷,建议避免使用。 文章通过代码示例和图示,系统讲解了智能指针如何解决资源泄漏问题,并比较了不同智能指针的实现特点。

Linux、C++、图形软件开发等。不一定每次都能写出完美的代码,但会认真搞懂每一个问题。 7376

Open3D 计算点云配准的旋转和平移误差

通过计算旋转误差和平移误差来量化配准结果与真实变换之间的偏差。

点云侠的博客 250

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

C++智能指针讲解和使用

本篇文章讲述了四种智能指针和它们的使用和注意事项,并且为了加深理解,还模拟实现了四种智能指针,供大家很本人在日常开发中进行参考。

Yu_Lijing的博客 1402

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

C++智能指针使用方法

unique_ptr:轻量、高效,适合独占资源,优先使用。shared_ptr:适合共享资源,但注意循环引用问题。weak_ptr:配合shared_ptr使用,解决循环引用,作为弱观察者。智能指针是C++内存管理的重要工具,但并非万能。理解其原理和适用场景,才能正确使用并避免潜在风险。

u010632343的博客 1180

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

【C++11】智能指针的使用

C++11智能指针的使用,带你领略智能指针浩瀚的世界

有梦想的电信狗 1282

C++ 智能指针的使用和原理

C++智能指针通过RAII机制自动管理内存资源,解决了传统手动内存管理的泄漏和悬垂指针问题。标准库提供了三种智能指针:unique_ptr(独占所有权,高效轻量)、shared_ptr(共享所有权,引用计数)和weak_ptr(解决循环引用)。智能指针在构造时获取资源,析构时释放资源,支持指针操作符重载,并禁用隐式转换。其中shared_ptr采用堆上动态分配的引用计数机制,确保资源安全共享;weak_ptr不增加引用计数,需通过lock()安全访问资源。智能指针还支持定制删除器和new[]的特化版本,是现

SouTY_C的博客 1297

【C++笔记】C++11智能指针的使用及其原理

哈喽,各位小伙伴大家好!上期我们讲了C++的异常机制。今天我们来讲一下C++智能指针的使用及其原理。话不多说,我们进入正题!向大厂冲锋什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存,一般是忘记释放或者发生异常释放程序未能执行导致的。内存泄漏并不是指内存在物理上的消失,而是是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:普通程序运行⼀会就结束了出现内存泄漏问题也不大,进程正常结束,页表的映射关系解除,物理内存也可以释放。

大白的编程日记. 2048

【C++】智能指针的使用及其原理

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存,一般是忘记释放或者发生异常释放程序未能执行导致的。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。内存泄漏的危害:普通程序运行一会就结束了出现内存泄漏问题也不大,进程正常结束,页表的映射关系解除,物理内存也可以释放。

uyeonashi的博客 1348

C++ 智能指针的使用

本文介绍了C++的3种常用智能指针的使用场景,编程方式。

Python技术探索 1219

C++智能指针作用与使用详解

摘要:C++智能指针(unique_ptr/shared_ptr/weak_ptr)通过RAII机制自动化内存管理,有效解决裸指针的三大痛点:内存泄漏(自动释放)、悬空指针(自动置空)和多次释放(引用计数)。unique_ptr实现独占所有权,适合局部资源管理;shared_ptr支持共享所有权,需配合weak_ptr避免循环引用。最佳实践包括优先使用make_unique/make_shared、默认选择unique_ptr、谨慎使用get()方法。智能指针通过明确所有权语义和异常安全保证,显著提升代码健

userxygh的博客 958

【C++】智能指针的使用和原理

智能指针类除了满足RAII的设计思路,还要方便资源的访问,所以智能指针类还会想迭代器类一样,重载operator*/operator->/operator[]等运算符,方便访问资源。

Become Mad的博客 1575
上一篇: C++11/14运行时断言与静态断言
下一篇: C++中atan()与atan2()的区别和用法
首飞爱玩机器人
博客等级 码龄14年 6989粉丝 120原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

首飞爱玩机器人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值