标签: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