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