在开始本文内容以前,咱们再来总结一下,前文内容:函数
1.智能指针采用RAII机制,在构造对象时进行资源的初始化,析构对象时进行资源的清理及汕尾.this
2.auto_ptr防止拷贝后析构释放同一块内存,采用"转移全部权"的方法.(实际开发中auto_ptr并不实用)spa
3.scoped_ptr与auto_ptr相似,可是它与auto_ptr最大的区别是:它不能转移全部权,即就是禁止拷贝/赋值!(固然,咱们也探讨了C++中禁止拷贝对象的技术,在此不赘述)指针
回顾完前文内容后,咱们今天来讨论shared_ptr.code
咱们虽然有了scoped_ptr,但在实际开发过程当中,咱们的确要是想对智能指针进行拷贝,那scoped_ptr就鞭长莫及了.对象
那么,咱们回到原始的问题:对智能指针进行拷贝,会出现什么状况?内存
咱们在第二篇文章也分析了:若是对智能指针不进行特殊处理,在析构时,会将同一块内存释放屡次,程序会崩溃!ci
所以,咱们要想对智能指针进行拷贝,就必须作一些特殊的处理,使得析构函数只释放一次内存.资源
此时,若是探究过深浅拷贝的同窗,可能心中已经有了答案:用引用计数!!!(深浅拷贝问题,之后我会讨论,不是本文重点)开发
考虑到有些童鞋可能不知道什么是引用计数,那我就在这里解释一下:
在引用计数中,每个对象负责维护对象全部引用的计数值。当一个新的引用指向对象时,引用计数器就递增,当去掉一个引用时,引用计数就递减。当引用计数到零时,该对象就将释放占有的资源。——百度百科
通俗一点的讲:在本例中咱们经过count变量来记录当前有多少个对象共同维护着这个指针,每次拷贝/赋值的时候,让count++.
1 2 3 4 5 6 7 8 |
|
当对象析构时,首先咱们看count是否是1,若是不是1,说明还有其余对象在维护这个指针,咱们让count--.不然的话,就说明,只有当前对象在维护这个指针,此时就能够愉快的把指针delete掉了.
1 2 3 4 5 6 7 8 9 10 |
|
经过这样的的形式,就能够保证:在多个shared_ptr对象共同维护一块内存中,对内存只delete一次.
最终,贴上我简化后shared_ptr的代码.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 |
|