Boost 中的智能指针

【学习总结】boost智能指针 一、为什么使用智能指针 为管理内存等资源,C++采取RAII机制(资源获取即初始化,Resource Acquisition Is Initialization),在使用资源的类的构造函数中申请资源并使用,最终在析构函数中释放资源。使用new在堆上创建对象时,其析构函数不会自动调用,需要使用delete才能释放资源,若因为异常导致程序未能执行delete,则存在内存泄露的问题。C++... 阅读详情

 这篇文章主要介绍 boost中的智能指针的使用。

    内存管理是一个比较繁琐的问题,C++中有两个实现方案: 垃圾回收机制和智能指针。垃圾回收机制因为性能等原因不被C++的大佬们推崇, 而智能指针被认为是解决C++内存问题的最优方案。

1. 定义

     一个智能指针就是一个C++的对象, 这对象的行为像一个指针,但是它却可以在其不需要的时候自动删除。注意这个“其不需要的时候”, 这可不是一个精确的定义。这个不需要的时候可以指好多方面:局部变量退出函数作用域、类的对象被析构……。所以boost定义了多个不同的智能指针来管理不同的场景。

shared_ptr<T> 内部维护一个引用计数器来判断此指针是不是需要被释放。是boost中最常用的智能指针了。
scoped_ptr<t> 当这个指针的作用域消失之后自动释放
intrusive_ptr<T> 也维护一个引用计数器,比shared_ptr有更好的性能。但是要求T自己提供这个计数器。
weak_ptr<T> 弱指针,要和shared_ptr 结合使用
shared_array<T> 和shared_ptr相似,但是访问的是数组
scoped_array<T> 和scoped_ptr相似,但是访问的是数组

2. Boost::scoped_ptr<T>

    scoped_ptr 是boost中最简单的智能指针。scoped_ptr的目的也是很简单, 当一个指针离开其作用域时候,释放相关资源。特别注意的一定就是scoped_ptr 不能共享指针的所有权也不能转移所有权。也就是说这个内存地址就只能给的声明的变量用,不能给其他使用。

    下面是scoped_ptr的几个特点:

  1. scoped_ptr的效率和空间的消耗内置的指针差不多。
  2. scoped_ptr不能用在标准库的容器上。(用shared_ptr代替)
  3. scoped_ptr 不能指向一块能够动态增长的内存区域(用scoped_array代替)

复制代码
1 class test
2 {
3 public:
4 void print()
5 {
6 cout << "test print now" <<endl;
7 }
8 };
9 int _tmain(int argc, _TCHAR* argv[])
10 {
11 boost::scoped_ptr<test> x(new test);
12 x->print();
13 return 0;
14 }
复制代码

3.Boost::shared_ptr<T>

    shared_ptr 具有如下几个特点:

  1. 在内部维护一个引用计数器, 当有一个指针指向这块内存区域是引用计数+1, 反之-1, 如果没有任何指针指向这块区域, 引用计数器为0,释放内存区域。
  2. 可以共享和转移所有权。
  3. 可以被标准库的容器所使用
  4. 不能指向一块动态增长的内存(用share_array代替)

我们可以看下如下例子:

复制代码
1 int _tmain(int argc, _TCHAR* argv[])
2 {
3 boost::shared_ptr<test> ptr_1(new test);
4 ptr_1->print();//引用计数为1
5 boost::shared_ptr<test> ptr_2 = ptr_1;
6 ptr_2->print();//引用计数为2
7 ptr_1->print();// 引用计数还是为2
8 return 0;
9 }
复制代码

4. Boost::intrusive_ptr<T>

    intrusive_ptr 的主要和share_ptr一样, 对比share_ptr,其效率更高,但是需要自己维护一个引用计数器, 这里不做详细介绍。

5. Boost::weak_ptr<T>

    weak_ptr 就是一个弱指针。weak_ptr 被shared_ptr控制, 它可以通过share_ptr的构造函数或者lock成员函数转化为share_ptr。

    weak_ptr的一个最大特点就是它共享一个share_ptr的内存,但是无论是构造还是析构一个weak_ptr 都不会影响引用计数器。

复制代码
1 int _tmain(int argc, _TCHAR* argv[])
2 {
3 boost::shared_ptr<test> sharePtr(new test);;
4 boost::weak_ptr<test> weakPtr(sharePtr);
5 //weakPtr 就是用來保存指向這塊內存區域的指針的
6 //干了一大堆其他事情
7 boost::shared_ptr<test> sharePtr_2 = weakPtr.lock();
8 if (sharePtr_2)
9 sharePtr_2->print();
10 return 0;
11 }
复制代码

6. Boost::shared_array<T> 和Boost::scoped_array<T>

    前面提到过shared_ptr和scoped_ptr不能用于数组的内存(new []),所以shared_array和scoped_array就是他们的代替品。我们可以看下shared_array的用法

复制代码
1 int _tmain(int argc, _TCHAR* argv[])
2 {
3 const int size = 10;
4 boost::shared_array<test> a(new test[]);
5 for (int i = 0; i < size; ++i)
6 a[i].print();
7 return 0;
8 }
复制代码

7. 使用智能指针的几个注意点

    下面是几个使用智能指针需要注意的地方:

  1. 声明一个智能指针的时候要立即给它实例化, 而且一定不能手动释放它。
  2. …_ptr<T> 不是T* 类型。所以:

                a: 声明的时候要…_ptr<T> 而不是….._ptr<T*>

                b:不能把T* 型的指针赋值给它

                c: 不能写ptr=NULl, 而用ptr.reset()代替。

  1.   不能循环引用。
  2. 不要声明临时的share_ptr, 然后把这个指针传递给一个函数

8. 总结

    智能指针使用上还是比较简单的, 而且能比较有效得解决C++内存泄露的问题,各位使用C++的童鞋赶快用起来吧。

C++基础之boost库的智能指针 boost 库定义在namespace boost 中,包含头文件 #include 即可使用。 Boost库中包含了几种智能指针,本文重点讨论shard_ptr。【boost::scoped_ptr】跟std::auto_ptr一样涌来管理单个堆内存对象,但是独享所有权,且不 阅读详情

相关推荐

ARS408毫米波雷达数据解析避坑指南:从硬件连接到Python处理

本文提供了ARS408毫米波雷达从硬件连接到Python数据处理的完整实战指南。针对串口通信不稳定、数据解析错误等常见问题,详细解析了硬件连接方案选择、串口数据高效读取策略、二进制协议解析的位操作技巧,并给出了坐标转换、目标跟踪及实时可视化的代码实现,帮助开发者快速搭建稳定的雷达数据处理流水线。

weixin_29091105的博客 149

boost笔记:智能指针--概述

boost::scoped_ptr http://www.boost.org/doc/libs/1_49_0/libs/smart_ptr/scoped_ptr.htm   scoped_ptr用于确保能够正确地删除动态分配(new)的对象。scoped_ptr永远不能被复制或被赋值!因此scoped_ptr拥有它所指向的资源的所有权,并永远不会放弃这个所有权。scoped_ptr构造时即

在水一方 1811

基于任务的功能磁共振成像的连接性分析

虽然这种方法通过减少偶然只选择特异性代表的可能性来改善可推广性,但类别内和类别间的变异性变得更难控制(例如,"鸟类"可能是一个比"车辆"更加/不那么同质的类别),并且可能会出现关于这些预定义类别是否是现实世界实体的有意义划分的担忧——尽管这个限制在某种程度上可以通过表征相似性分析来解决。特别是,海马单变量激活和语义认知区域(左下额回)中语义信息的表征强度之间的交互预测了项目的概念记忆,而海马单变量激活和视觉处理区域(腹内侧枕叶皮层)中视觉属性的表征强度之间的交互预测了图像样本的知觉记忆。

cc1609130201的博客 2231

boost智能指针

智能指针只是这个习语的其中一例——当然是相当重要的一例。一经初始化,智能指针 boost::scoped_ptr 所包含的对象,可以通过类似于普通指针的接口来访问。boost::ptr_vector 类的定义在 boost/ptr_container/ptr_vector.hpp 里,它跟前一个例子中用 boost::shared_ptr 模板参数来初始化的容器具有相同的工作方式。通过调用弱指针的 lock() 函数可以解决这个问题:如果对象存在,那么 lock() 函数返回的共享指针指向这个合法的对象。

weixin_52243202的博客 1190

告别深度学习!用5个麦克风搞定多说话人分离:ReTM算法保姆级教程

本文详细介绍了ReTM算法,这是一种无需深度学习、仅需5个麦克风即可实现多说话人语音分离的创新信号处理方法。它通过估计相对传递矩阵,利用空间物理信息在混响环境中分离语音,具有数据需求低、计算复杂度小、无需先验几何信息等优势,特别适合嵌入式设备和资源受限场景。

desk3的博客 157

nnDetection复现Luna16 附模型

淘论文发现nnDetection框架对肺结节的检测效果挺好,便跑了跑复现了下, 作者诚不欺人,确实挺好, 并附上我依据文档训练的模型。

HeavenWalker 2597

boost之智能指针

boost中的智能指针有。

多看多听多总结 841

利用autojs制作抢购支付宝消费劵的手机脚本

前期准备工作 1.打开支付宝,点击中间的抢消费券的广告 2.点击左上角,将抢购页面添加到首页 3.查看支付宝首页是否出现消费劵 . autojs代码 "auto"; functiontaskstart(){ sleep(1000); launchApp('支付宝'); toast("正在打开支付宝应用"); sleep(1000); varxf=textContains("消费").findOne().bounds(); ...

洛阳泰山的博客 1万+

Boost库智能指针

背景: 1998年修订的第一版C++标准只提供了一种智能指针:std::auto_ptr。 它基本上就像是个普通的指针: 通过地址来访问一个动态分配的对象。std::auto_ptr之所以被看作是智能指针,是因为它会在析构的时候调用delete操作符来自动释放所包含的对象。 当然这要求在初始化的时候,传给它一个由new操作符返回的对象的地址。 既然std::auto_ptr的析...

Zy100Papa的博客 325

YOLOv11 改进 - 注意力机制 | 空间增强注意力SEAM(Spatially Enhanced Attention Module)提升遮挡场景检测鲁棒性

本文介绍了分离与增强注意力模块(SEAM)在YOLOv11中的结合应用。SEAM模块旨在增强面部特征学习能力,特别是处理面部遮挡问题。它采用多头注意力机制强调面部区域、抑制背景区域,第一部分使用深度可分离卷积减少参数并学习通道重要性,通过1x1卷积增强通道联系,利用两层全连接网络融合通道信息,经指数归一化后作为注意力权重与原始特征相乘。我们将SEAM集成到YOLOv11的检测头中,并进行相关注册和配置。实验表明,该方法有助于提升模型检测性能。

魔改工程师的博客 1665

Xilinx FPGA平台DDR3设计保姆式教程(1)DDR3基础简介

xilinx平台DDR3设计(1)DDR3简介 如果我们只是拿来用ddr搬砖,那么它就简单,知道IP怎么使用就好,但是要想知其所以然,理论知识是必备的,这也是我们初学者所欠缺的东西,慢慢修炼吧! 目录 一、DDR3简介 二、地址的概念及容量计算 三、重要给概念理解 3.2 列地址脉冲选通潜伏期 3.4 掩码 四、参考资料 一、DDR3简介 DDR3全称double-data-rate 3 synchronous dynamic RAM,即第三代双倍速率同步动态随机存储器。...

数字IC/FPGA杂货铺,找一找,或许有你想要的~ 1万+

<C++学习>C++ Boost 智能指针教程

是一种封装了指针的类,可以自动管理动态内存的生命周期,避免手动释放内存。Boost 提供了一些强大的智能指针工具,用于安全和高效地管理动态内存。),Boost 的智能指针不仅简化了内存管理,还避免了常见的内存泄漏问题。通过系统学习这些智能指针,你将能更高效地管理动态内存,避免内存泄漏问题!是一种独占所有权的智能指针,无法复制或转移。可以安全地存储在 STL 容器中,避免重复释放内存。是一种高效的方式,用于创建。

卤煮小鱼的博客 1231

用 Python 和 XGBoost 进行疾病诊断预测

疾病诊断预测是医疗领域的重要研究方向,准确的疾病诊断预测可以帮助医生提前制定治疗方案,提高治疗效果,降低医疗成本。本文章的目的是介绍如何使用 Python 和 XGBoost 算法构建疾病诊断预测模型。范围涵盖了从数据预处理、模型训练到模型评估的整个流程,同时通过实际案例展示如何将该模型应用于疾病诊断预测中。本文首先介绍了疾病诊断预测的背景和 XGBoost 算法的核心概念,然后详细讲解了 XGBoost 算法的原理和具体操作步骤,包括 Python 代码实现。

AI Python 编程之道的博客 1064

Boost的智能指针

  Boost介绍 Boost是“一个免费的,可移植的,同步评测的C++库,Boost堪称是新类库的典范,特别是其中那些能够与ISO C++标准库良好的协同工作的库。”但是Boost不仅仅是一个库的集合。它也是一个快速发展的开发者社区,这些开发者创建,使用以及参与讨论Boost。这个库堪称是一个设计稳固类的精典范例。Boost库的质量和它的技术标准是十分令人惊异的。Boost可移植性标准确保了

armman的专栏 1079

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

关于boost和loki的智能指针

    技术文档(Document)     撰文/马维达     智能指针的标准之争:Boost vs. Loki       2001 年10 月和2002 年4 月,在美国的华盛顿和荷兰的安的列斯群岛上分别召开了两次C++标准会议。会议的内容之一是对一项新的C++特性提议——智能指针(Smart Pointer)——进行讨论。本文将对可能成为C++新标准的两种智能指针方案(Boost vs.

Scorpio Auding @ Blog++ 1853

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

C++之boost智能指针

因为类Y中有X的对象,这样如果X类改变,所有Y的对象都需要重新编译,因为此时类Y的大小已经改变,这样客户程序就不仅仅依赖于接口,还依赖于库里面的具体实现。由于智能指针本身是一个栈对象,它的作用域结束的时候,自动调用析构函数,从而调用了delete释放了堆对象。将对象改成指针(32位的4个字节,64位8个字节,这是不会变化的)如果一定要使用到类的对象的话,那就把类的对象都抽象到同一个类Impl中,然后通过Impl的指针来访问。智能指针的本质思想是:将堆对象的生存期,用栈对象来管理。这个栈对象就是智能指针。

优快云_HZW的博客 758

Camera2Demo

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

使用boost智能指针需要的文件

在工程目录新建个boost目录,添加这些文件。 这样代码中就能使用boost的智能指针了...

zctong的专栏 571

boost 3智能指针

前言 智能指针是一个保存指向动态内存(堆上内存)的指针的一个对象。它使用起来很像内建指针但是它会在自己析构的时候自动释放指针指向的内存。当遇到异常的时候,智能指针更加有优势,它们会确保管理的对象的内存被正确释放。 如下这个列子即使遇到异常,这个时候会释放所有栈上的内存,这个时候智能指针的对象会被析构从而释放 动态内存 对象所占用的内存。 void Fun () { smart_ptr&amp;lt;T...

我喜欢雨天的清新的博客 617

Boost智能指针-基础篇

简介 内存管理一直是 C++ 一个比较繁琐的问题,而智能指针却可以很好的解决这个问题,在初始化时就已经预定了删除,排解了后顾之忧。1998年修订的第一版C++标准只提供了一种智能指针:std::auto_ptr(现以废弃),它基本上就像是个普通的指针:通过地址来访问一个动态分配的对象。std::auto_ptr之所以被看作是智能指针,是因为它会在析构的时候调用delete操作符来自动释放所包

liufei_learning--脚踏实地,戒骄戒躁! 6233

Boost之智能指针

boost.smart_ptr库提供了六种智能指针,包括scoped_ptr、scoped_array、shared_ptr、shared_array、weak_ptr和intrusive_ptr。为了使用smart_ptr组件,需要包含头文件。 Scoped_ptr scoped_ptr是一个很类似auto_ptr/unique_ptr的智能指针,但scoped_ptr的所有权更加严格,不能

optcaelum的博客 588

boost教程之智能指针

智能指针的原理基于一个常见的习语叫做 RAII :资源申请即初始化。智能指针确保在任何情况下,动态分配的内存都能得到正确释放,从而将开发人员从这项任务中解放了出来。 这包括程序因为异常而中断,原本用于释放内存的代码被跳过的场景。 1、C++标准库中的智能指针 1998年修订的第一版C++标准只提供了一种智能指针: std::auto_ptr ,包含在头文件<memory>中: ...

王木木 759

boost 智能指针

Boost库智能指针

x_y_y的博客 852

Boost库 --- 四种智能指针

Boost库 --- 四种智能指针 智能指针基本思想: 智能指针:主要有Boost库中的智能指针和STL标准库中的智能指针构成 auto_ptr unique_ptr(引入前在boost库中叫做scope_ptr) shared_ptr weak_ptr 其中auto_ptr为C++11标准之前拥有,但是auto_ptr问题很大,所以在C++11标准后引入了三种boost...

IT_Quanwudi的博客 787
上一篇: matlab 读取文件数据的方式
下一篇: OpenCV的最近邻开源库FLANN
FireMicrocosm
博客等级 码龄12年 261粉丝 56原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值