以下为智能指针的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也是会有的。