码迷,mamicode.com
首页 > 其他好文 > 详细

再谈智能指针

时间:2017-01-01 17:16:02      阅读:192      评论:0      收藏:0      [点我收藏+]

标签:new   out   style   poi   count   原因   地址   return   doc   

http://www.cnblogs.com/lewiskyo/p/4214592.html  之前写过一篇文章介绍智能指针,并且简单实现了auto_ptr.

里面提到 auto_ptr 不能做为Stl容器的元素,原因具体是 http://www.360doc.com/content/14/0429/16/1317564_373230218.shtml

简要来说就是在对Stl容器元素进行复制构造时,不能改变原来的值(const T2& value),而auto_ptr在复制构造的时候,一定会修改元素的值(即将指向实际内存地址的指针置NULL),

否则就会两个指针指向同一个地址,当析构的时候就会出现重复析构。

而在引入shared_ptr后,这个问题就解决了,因为shared_ptr有引用数量。

 

这里想简单实现下 shared_ptr, 代码基于 http://www.cnblogs.com/yangshaoning/archive/2012/03/18/cpp_smart_pointer.html 

这里加上了模板,代码如下:

 1 #include <iostream>
 2 #include <vector>
 3 using namespace std;
 4 
 5 
 6 template <typename T> class SmartPtr;
 7 
 8 template<typename T>
 9 class RefPtr
10 {
11     friend class SmartPtr<T>;
12 
13     RefPtr(T *pointer = NULL):t( pointer), count(1)
14     {
15     }
16 
17     ~RefPtr()
18     {
19         cout << "destructor delete refptr" <<endl;
20         delete t;
21     }
22 
23     T *t;
24     int count;
25 
26 };
27 
28 
29 template<typename T>
30 class SmartPtr
31 {
32     public:
33         SmartPtr( T* object): rp(new RefPtr<T>(object))
34         {
35         }
36 
37         SmartPtr(const SmartPtr& rhs):rp(rhs.rp)
38         {
39             ++rp->count;
40         }
41 
42         SmartPtr& operator=(const SmartPtr &rhs)
43         {
44             if(this == &rhs)
45                 return *this;
46             
47             --rp->count;
48             if (rp->count == 0)
49                 delete rp;
50             
51             rp = rhs.rp;
52             ++rp->count;
53     
54             return *this;
55         }
56 
57         ~SmartPtr()
58         {
59             --rp->count;
60             if (rp->count == 0)
61                 delete rp;
62         }
63 
64     private:
65         RefPtr<T> *rp;
66 };
67 
68 
69 int main()
70 {
71     
72     {
73         SmartPtr<int> s1(new int(10));
74         SmartPtr<int> s2(s1);
75     
76         SmartPtr<int> s3 (new int (20));
77         s3 = s1;
78     }
79 
80     cout << "operator v1" << endl;
81 
82     {
83         vector<SmartPtr<int> > v1;
84         v1.push_back(SmartPtr<int>(new int (10)));
85         v1.push_back(SmartPtr<int>(new int (10)));
86         v1.push_back(SmartPtr<int>(new int (10)));
87         v1.push_back(SmartPtr<int>(new int (10)));
88     }
89 
90     cout << "operator v1 end" << endl;
91 }

 

几个注意点:

1. 第六行需要前置声明SmartPtr,否则RefPtr会识别不了这个友元.

2. RefPtr::count仅在SmartPtr内改变值。

3. SmartPtr::rp仅是一个指针,若然多个SmartPtr指向同一个对象,那么多个SmartPtr::rp则共享同一份地址,当SmartPtr析构时,--count,count==0时要 delete rp, 释放rp指向的地址,其他情况不必delete,只需要让系统回收rp指针所占用的地址即可。

 

再谈智能指针

标签:new   out   style   poi   count   原因   地址   return   doc   

原文地址:http://www.cnblogs.com/lewiskyo/p/6241195.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!