C++的RAII和智能指针小结

原创 2016年05月31日 09:07:46


RAII:资源分配即初始化,利用构造函数和析构函数定义一个类来完成对资源的分配和释放

智能指针主要用来防止内存泄漏,我们来举个栗子,看看为什么会有智能指针这个东东

例1:

wKiom1cFEh6BAN-AAABe101cjJc063.png

对于上面这段程序,由于抛出异常的时候影响了代码的执行流,所以要在异常捕获之前将p提前释放(详见

我的博客:C++的异常浅析),虽然可以通过再次抛出以异常解决这个问题,但是在代码美观方面不够完

美,更重要的是如果在代码量非常大,而且在多处有动态开辟出来的空间的时候,仅仅通过再次抛出异常已

经远远不够解决这个问题了,会使得工作量大大加大,那么有没有什么办法可以解决这种问题,而且不增加

工作量呢?

此刻就轮到我们的智能指针出场啦

首先我们先来认识五种智能指针

autoptr:管理权的转移(最好不要使用,比较鸡肋)

scoped ptr:强制防拷贝(针对和指针)

scoped array:强制防拷贝(针对数组)

shared ptr:引用计数,通过增减计数器来管理,最后一个对象释放(针对指针)

shared array:同上,针对数组

第一个先来看看autoptr类的实现

spacer.gifwKioL1cFE1ySdKToAACZhjgUZEY410.pngwKioL1cFE4OxGqgzAABoAYPhsfI479.png

spacer.gif

在我们刚开始学C++的时候可以知道当一个对象出了其作用域,就会自动调用她的析构函数,而智能指针正

是利用了这个原理,在用智能指针构造对象的时候就会自动调用析构函数,这样就不会发生内存泄漏的问题

了。

那么问题又来了,智能指针本身并不是一个真正意义上的指针,而是一种“仿造”的指针,所以为了使它看

起来更像指针,就要对它的*和->进行一次重载,这样看起来就更像指针啦

接下来要介绍的几种智能指针相比autoptr会更实用一些,但是他们都属于boost库中的库函数,需要下载后

才能直接使用哦,我们来看一下它的类的实现

wKioL1cFE7zztoGCAACBm1sTqFU020.png

spacer.gif

可以看出,为了防止拷贝,scopedptr的类在实现的时候将她的拷贝构造和赋值符重载声明在了protected

中,这样是为了防止有人恶意从外部对其进行实现。


记住防拷贝的两个条件:①只声明,不实现

              ②声明成保护或私有

而和scopedptr很相似的scoped array,实现的机制和scopedptr是很像的,只不过在访问它的内部成员时,

既不需要很麻烦了,只需要重载一下[ ],就可以很容易访问了。


spacer.gifwKioL1cFE-PSoaz_AACtCvSTPW4323.png


最后我们再来看看sharedptr,在前面我们学过写时拷贝,同样也是利用了引入计数器,所以在这里就不是

很难理解了,在它的类里面多了一个成员_pcount,表示指向当前对象的指针的个数,这样可以直观的理解

sharedptr的实现机制了



spacer.gifwKioL1cFFEXTYdWIAADKlXa3Y54718.png

wKiom1cFE9iiqzfNAAAwNfAEMv8146.png

spacer.gif

现在就剩下sharedarray了,和sharedptr一样,只需要重载它的[ ],其余的就和sharedptr差不多了

wKiom1cFE_yBM8_pAACyxYvZJuE927.pngwKioL1cFFL_QV4cnAABe101cjJc221.png

spacer.gif

 spacer.gif

通过上面的简单介绍,相信大家对智能指针也有一定的了解了,既然智能指针这么好用,后面的编程肯定会

有很多地方用到它,所以掌握它们的用法是很重要的咯。


本文出自 “福大馨” 博客,转载请与作者联系!

版权声明:本文为博主原创文章,未经博主允许不得转载。

RAII&智能指针

RAII:资源分配及初始化。但是这个翻译并没有显示出这个惯用法的真正内涵。RAII的好处在于它提供了一种资源自动管理的方式,当出现异常,回滚等现象时,RAII可以正确的释放资源。内存泄漏会导致:   ...
  • qq_25253287
  • qq_25253287
  • 2016年06月06日 10:29
  • 107

RAII和智能指针的实现

RAII在C++effective一书中讲到,RAII是“Resource acquisition is initialization”,直译为“资源获取就是初始化”。它是基于这样的原理,栈的变量会自...
  • xy913741894
  • xy913741894
  • 2017年04月05日 12:14
  • 239

C++编程规范之13:确保资源为对象所拥有。使用显示的RAII和智能指针

摘要:     利器在手,不要再徒手为之:C++的“资源获取及初始化”(ResourceAcquisition Is Initialization,RAII)惯用法是正确处理资源的利器。RAII使编...
  • longshengguoji
  • longshengguoji
  • 2013年12月09日 21:17
  • 1730

C++之RAII技术解析

1.什么是RAII 技术? 我们在C++中经常使用new申请了内存空间,但是却也经常忘记delete回收申请的空间,容易造成内存溢出,于是RAII技术就诞生了,来解决这样的问题。RAII(Resour...
  • doc_sgl
  • doc_sgl
  • 2015年01月22日 22:51
  • 5645

C++11实现模板化(通用化)RAII机制

什么是RAII?RAII(Resource Acquisition Is Initialization),也称直译为“资源获取就是初始化”,是C++语言的一种管理资源、避免泄漏的机制。 C++标准保...
  • 10km
  • 10km
  • 2015年11月15日 10:04
  • 2892

智能指针的两种实现(引用计数)

在微信上看到一篇“C++引用计数及智能指针的简单实现”的好文章点击打开链接,通俗易懂,激起了敲代码的兴趣,于是用两种方式实现了简单的智能指针(辅助类+SmartPtr类 vs SmartPtr类)。...
  • ZongYinHu
  • ZongYinHu
  • 2016年05月28日 22:28
  • 699

C++之 RAII基本理解与使用

产生原因:      在C++中,如果在这个程序段结束时需要完成一些资源释放工作,那么正常情况下自然是没有什么问题,但是当一个异常抛出时,释放资源的语句就不会被执行。于是Bjarne Stroust...
  • My_heart_
  • My_heart_
  • 2016年09月06日 18:28
  • 344

c++ 智能指针- shared_ptr和weak_ptr

c++中智能指针的作用是非常大的,它不仅能解决很多裸指针带来的内存相关问题,还能用来管理资源(RAII)。 c++中的智能指针有很多种,其中以shared_ptr和weak_ptr最为重要(个人观点)...
  • hp_truth
  • hp_truth
  • 2014年10月27日 18:10
  • 2296

boost学习之RAII机制(资源申请即初始化)

/* 先介绍下一个专业词汇:RAII(Resource Application Immediately Initialize)资源申请即初始化。 这也是智能指针的基本原理,智能指针只是这个习语的其中...
  • baliguan163
  • baliguan163
  • 2015年01月09日 14:36
  • 873

C++ —— RAII编程思想

RAII则是在C++项目中用于资源管理的一种重要的编程思想。
  • noahzuo
  • noahzuo
  • 2016年04月13日 07:39
  • 918
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:C++的RAII和智能指针小结
举报原因:
原因补充:

(最多只允许输入30个字)