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