以下为智能指针的demo。
设计思路为:通过一个引用计数的指针在多个auto_ptr<Type>中共享Type对象。
1 // auto_ptr.h
2 #include <iostream>
3 namespace myspace
4 {
5 template <class T>
6 class auto_ptr
7 {
8 T *t; // 指针对象
9 size_t *use; // 引用计数,采用指针的方式是为了方便多个auto_ptr的共享
10 public:
11 //!< 一般构造函数
12 auto_ptr(T *obj)
13 : t(obj) // 接收指针
14 , use(new size_t(1)) // 创建引用计数
15 {
16 }
17 //!< 拷贝构造函数
18 auto_ptr(const auto_ptr<T> &ptr)
19 : t(ptr.t)
20 , use(ptr.use)
21 {
22 ++*(ptr.use); // 传递引用计数后,计数值+1
23 }
24 ~auto_ptr()
25 {
26 // 每次析构的时候,如果计数值为0则删除对象
27 if (--*use == 0)
28 {
29 delete t;
30 delete use;
31 }
32 }
33 //!< ->操作符重载
34 T* operator-> () const
35 {
36 return t;
37 }
38 //!< *操作符重载,返回指针对象的引用
39 T& operator* () const
40 {
41 return *t;
42 }
43 };
44
45 //!< 流输出,采用了*操作符,所以不需要设为friend
46 template <class Type>
47 std::ostream& operator<< (std::ostream &os, auto_ptr<Type> ptr)
48 {
49 os << *ptr;
50 return os;
51 }
52 }//end of myspace
53
54 // main.cpp
55 #include <iostream>
56 #include "auto_ptr.h"
57 #ifdef _DEBUG
58 #define new new (_NORMAL_BLOCK, __FILE__, __LINE__)
59 #endif
60 int main(int argc, _TCHAR* argv[])
61 {
62 myspace::auto_ptr<int> iptr(new int(9)) ;
63 std::cout << iptr << std::endl;
64 ++ *iptr;
65 std::cout << iptr << std::endl;
66 (*iptr) --;
67 std::cout << iptr << std::endl;
68 getchar();
69 return 0;
70 }
71
从上面的Demo中,可以看到这个智能指针的缺点:
每次创建智能指针的时候,传入的指针是对外暴露的,采用new的方式作为入参才能保证安全的。如果这个new出来的对象(如上面的int(9))在别处被delete了,继续使用这个智能指针相当于使用一个野指针。这样的问题即便是boost的share_ptr也是会有的。