本文我们主要来总结一下前文介绍过的智能指针相关原理及实现,顺便补充一下前文未提到的shared_ptr删除器部分的内容.
总结:
1.智能指针,通过RAII机制,构造对象时完成资源的初始化,析构对象时,对资源进行清理和汕尾.
2.auto_ptr,防止拷贝/赋值对象后,析构时多次delete对象导致程序崩溃,因此它通过“转移所有权”,完成赋值/拷贝,保证只有一个对象维护、释放指针.实际开发中,并不常用.
3.scoped_ptr与auto_ptr类似,只是它不会“转移所有权”,而是禁止对象的拷贝/赋值.(把拷贝构造函数、赋值运算符重载设为private,并且只给出声明,不提供定义)
4.shared_ptr,通过引用计数来管理指针,当出现新对象维护同一块指针时,引用计数增加.当引用计数为1时,才真正的delete指针.
5.weak_ptr,解决shared_ptr循环引用的问题,与shared_ptr一起使用,不能单独使用.
补充:shared_ptr定制删除器
通过前文,我们已经知道shared_ptr是比较实用的智能指针.
我们可以通过非常简洁的语句管理指针:
#include<iostream> #include<memory> using namespace std; int main(){ shared_ptr<int> sp1(new int(10)); cout<<*sp1<<endl; *sp1 = 20; cout<<*sp1<<endl; return 0; }
对于我们动态申请的内存,构造时完成初始化,析构时通过delete来释放没有任何问题.
但,倘若是一个文件类型的指针呢?
#include<iostream> #include<memory> using namespace std; int main(){ shared_ptr<FILE> sp1(fopen("test.txt","w")); //如果不进行任何特殊处理,则程序崩溃! return 0; }
因此,shared_ptr提供了删除器功能,我们可以通过定制删除器,来对特定的资源进行回收.
#include<iostream> #include<memory> using namespace std; //仿函数 struct Fclose{ void operator()(void *ptr){ fclose((FILE*)ptr); cout<<"不用担心,shared_ptr已经通过调用我关闭了文件!"<<endl; } }; int main(){ //我们通过传入仿函数,来完成对文件指针的清理 shared_ptr<FILE> sp1(fopen("test.txt","w"),Fclose()); return 0; }
至此,定制shared_ptr删除器部分到这里就已经完美收官了!
那么,智能指针部分到这里就告一段落了....感谢阅读!