浅谈智能指针

1、为什么要使用智能指针?

       C++的内存管理是让很多人头疼的事,一不小心就会发生内存泄漏,重复释放,野指针等问题。大部分关于指针的问题都是来源于堆空间,为什么呢?我们知道栈上的空间是由系统维护的,申请和释放的工作都是由系统根据栈的性质来完成的,不需要我们过多干预。而堆上空间的申请(new)和释放(delete)都必须由程序员显示的调用,并且很重要的一点,这段空间的生命周期就在new 和 delete 之间。但是我们不能避免程序还未执行到delete就跳转了,或者在函数中没有执行到delete语句就返回了,如果我们不在每一个可能跳转和返回之前释放内存,就会造成内存泄漏。所以程序员必须很仔细的申请并给出对应的释放语句,但是由于程序的复杂都增大,判断、循环、递归这样的语句会让程序的走向处于不定境地。很有可能出现内存泄露的问题。使用智能指针可以很大程度上的避免这个问题,因为智能指针就是一个类,当超出了类的作用域是,类会自动调用析构函数,析构函数会自动释放资源。

2、什么是RAII?

 RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这样做有两个好处:

            (1)我们不需要再显示的释放资源

            (2)采用这种方式,对象所需的资源在其生命期内始终保持有效

在C++中它被应用的实例除了这里的智能指针,还有C++11中的lock_guard 对互斥锁的管理也是典型的RAII机制。关于RAII模板化实现 ,参考下面的博客链接。

参考:https://blog.youkuaiyun.com/10km/article/details/49847271

但是我们要注意RAII != 智能指针,它只是解决问题的一种思想。智能指针顾名思义,它肯定要有指针的行为,因此我们还需要把* 和 -->进行重载。

3、有哪些智能指针?

1、auto_ptr

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值