浅剖智能指针----auto_ptr

刚刚在复习的时候遇到了智能指针,就一时兴起去找出了智能指针的源码看了看,现将我对auto_ptr的理解记录如下:

Linux下,auto_ptr源码在/usr/include/c++/4.4.7/backword/auto_ptr.h

auto_ptr本身是一个模板类,封装了一个原生指针。它最大的特点是在拷贝构造、赋值、传参等过程中对原生指针控制权的转移,即会将自己所管理的指针release掉,并赋给新的auto_ptr对象。

<!--more-->

代码如下:

_BACKWARD_AUTO_PTR_H
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
#define _BACKWARD_AUTO_PTR_H 1
#include &lt;bits/c++config.h&gt;
#include &lt;debug/debug.h&gt;
_GLIBCXX_BEGIN_NAMESPACE(std)
template&lt;typename _Tp1&gt;
struct auto_ptr_ref
{
_Tp1* _M_ptr;
explicit
auto_ptr_ref(_Tp1* __p): _M_ptr(__p) { }
} _GLIBCXX_DEPRECATED_ATTR;
template&lt;typename _Tp&gt;
class auto_ptr
{
private:
_Tp* _M_ptr;
public:
typedef _Tp element_type;
explicit
auto_ptr(element_type* __p = 0) throw() : _M_ptr(__p) { }
auto_ptr(auto_ptr&amp; __a) throw() : _M_ptr(__a.release()) { }
template&lt;typename _Tp1&gt;
auto_ptr(auto_ptr&lt;_Tp1&gt;&amp; __a) throw() : _M_ptr(__a.release()) { }
auto_ptr&amp;
operator=(auto_ptr&amp; __a) throw()
{
reset(__a.release());
return *this;
}
template&lt;typename _Tp1&gt;
auto_ptr&amp;
operator=(auto_ptr&lt;_Tp1&gt;&amp; __a) throw()
{
reset(__a.release());
return *this;
}
~auto_ptr() { delete _M_ptr; }
element_type&amp;
operator*() const throw()
{
_GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
return *_M_ptr;
}
element_type*
operator-&gt;() const throw()
{
_GLIBCXX_DEBUG_ASSERT(_M_ptr != 0);
return _M_ptr;
}
element_type*
get() const throw() { return _M_ptr; }
element_type*
release() throw()
{
element_type* __tmp = _M_ptr;
_M_ptr = 0;
return __tmp;
}
void
reset(element_type* __p = 0) throw()
{
if (__p != _M_ptr)
{
delete _M_ptr;
_M_ptr = __p;
}
}
auto_ptr(auto_ptr_ref&lt;element_type&gt; __ref) throw()
: _M_ptr(__ref._M_ptr) { }
auto_ptr&amp;
operator=(auto_ptr_ref&lt;element_type&gt; __ref) throw()
{
if (__ref._M_ptr != this-&gt;get())
{
delete _M_ptr;
_M_ptr = __ref._M_ptr;
}
return *this;
}
template&lt;typename _Tp1&gt;
operator auto_ptr_ref&lt;_Tp1&gt;() throw()
{ return auto_ptr_ref&lt;_Tp1&gt;(this-&gt;release()); }
template&lt;typename _Tp1&gt;
operator auto_ptr&lt;_Tp1&gt;() throw()
{ return auto_ptr&lt;_Tp1&gt;(this-&gt;release()); }
} _GLIBCXX_DEPRECATED_ATTR;
template&lt;&gt;
class auto_ptr&lt;void&gt;
{
public:
typedef void element_type;
} _GLIBCXX_DEPRECATED_ATTR;
_GLIBCXX_END_NAMESPACE
#endif /* _BACKWARD_AUTO_PTR_H */