1 #pragma once
2 
3 template<typename T> class AutoPtr
4 {
5 	public:
6 		explicit AutoPtr (T* const p = 0) :
p_(p)7 			p_(p)
8 		{
9 		}
10 
~AutoPtr()11 		~AutoPtr ()
12 		{
13 			if (p_)
14 				delete p_;
15 		}
16 
deallocate()17 		void deallocate ()
18 		{
19 			*this = 0;
20 		}
21 
release()22 		T* release ()
23 		{
24 			T* const p = p_;
25 			p_ = 0;
26 			return p;
27 		}
28 
29 		void operator = (T* const p)
30 		{
31 			if (p_)
32 				delete p_;
33 			p_ = p;
34 		}
35 
36 		T* operator -> () const
37 		{
38 			return p_;
39 		}
40 
41 		T& operator * () const
42 		{
43 			return *p_;
44 		}
45 
46 		operator bool () const
47 		{
48 			return p_;
49 		}
50 
51 		operator T* () const
52 		{
53 			return p_;
54 		}
55 
56 	private:
57 		T* p_;
58 
59 		AutoPtr (const AutoPtr&); /* no copy */
60 		void operator = (AutoPtr&); /* no assignment */
61 };
62