前言:哈喽小伙伴们,今天我们继续来分享C++的一个全新知识——智能指针。
目录
一.何为智能指针
RAII
二.智能指针的种类
三.内存泄漏
结语
一.何为智能指针
RAII
RAII(Resource Acquisition Is Initialization)是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。
在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:
- 不需要显式地释放资源。
- 采用这种方式,对象所需的资源在其生命期内始终保持有效。
借由RAII的思想,我们引出智能指针:
template<class T>
class SmartPtr {
public:SmartPtr(T* ptr = nullptr): _ptr(ptr){}~SmartPtr(){if(_ptr)delete _ptr;}
private:T* _ptr;
};
void Func()
{SmartPtr<int> sp1(new int);SmartPtr<int> sp2(new int);cout << div() << endl;
}
所谓智能指针,就是通过一个类来控制指针对象的存亡,通过这种方式创建的对象,只要函数退出,就会自动执行其析构函数。
二.智能指针的种类
上述我们所实现的,只是智能指针的基础部分,那么在C++的库中,是包含很多种智能指针的:
- auto_ptr
- unique_ptr
- shared_ptr
这三种智能指针,在智能指针之间的拷贝赋值中有所区别。
auto_ptr指针如果进行拷贝,是通过转移管理权的思想,也可以理解为移动构造,直接争夺资源,但是并不会造成原指针的销毁,而是置空。
unique_ptr指针简单粗暴,直接就是禁止进行拷贝。
能够看出,上述两种智能指针,都不允许指针之间进行数据共享,而shared_ptr却可以:
shared_ptr的原理:是通过引用计数的方式来实现多个shared_ptr对象之间共享资源。
其具体实现方式为:
- shared_ptr在其内部,给每个资源都维护了着一份计数,用来记录该份资源被几个对象共享。
- 在对象被销毁时(也就是析构函数调用),就说明自己不使用该资源了,对象的引用计数减一。
- 如果引用计数是0,就说明自己是最后一个使用该资源的对象,必须释放该资源;
- 如果不是0,就说明除了自己还有其他对象在使用该份资源,不能释放该资源,否则其他对象就成野指针了。
再日常使用中,shared_ptr是最常用也是最推荐的智能指针。
三.内存泄漏
那么我们设计智能指针的目的,就是为了防止发生内存泄漏。
什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费。
内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现内存泄漏会导致响应越来越慢,最终卡死。
结语
关于智能指针就分享这么多,喜欢本篇文章记得一键三连,我们下期再见!