青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

LoveBeyond

STL auto_ptr智能指針簡單分析

程序人生 >> STL auto_ptr智能指針簡單分析:a
uto_ptr是STL里面的智能指針(Smart Pointer)
,一個很好的優點就是指針所有權自動轉移和指針自動刪除技術。對于異常和經常忘記delete的情況來說很實用。
下面就是從SGI官方網站轉載的STL auto_ptr實現源碼(加上了我的注釋):
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
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
/*
* Copyright (c) 1997-1999
* Silicon Graphics Computer Systems, Inc.
*
* Permission to use, copy, modify, distribute and sell this software
* and its documentation for any purpose is hereby granted without fee,
* provided that the above copyright notice appear in all copies and
* that both that copyright notice and this permission notice appear
* in supporting documentation.  Silicon Graphics makes no
* representations about the suitability of this software for any
* purpose.  It is provided "as is" without express or implied warranty.
*
*/
 
#ifndef __SGI_STL_MEMORY
#define __SGI_STL_MEMORY
 
#include <stl_algobase.h>
#include <stl_alloc.h>
#include <stl_construct.h>
#include <stl_tempbuf.h>
#include <stl_uninitialized.h>
#include <stl_raw_storage_iter.h>
 
 
__STL_BEGIN_NAMESPACE
// 如果定義了auto_ptr轉換以及支持成員函數模板
#if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \
	defined(__STL_MEMBER_TEMPLATES)
// 定義auto_ptr_ref template結構體①
template<class _Tp1> struct auto_ptr_ref {
	_Tp1* _M_ptr;
	auto_ptr_ref(_Tp1* __p) : _M_ptr(__p) {}
};
 
#endif
 
template <class _Tp>
class auto_ptr {
private:
	_Tp* _M_ptr;
 
public:
	typedef _Tp element_type;
	// explicit修飾構造函數,防止從原始指針隱式轉換
	explicit auto_ptr(_Tp* __p = 0) __STL_NOTHROW : _M_ptr(__p) {}
	// Copy構造函數,注意這里是直接引用傳參(非const),同時轉移指針所有權
	auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {}
 
// 如果允許定義成員函數模板(Member Function Templates)②
#ifdef __STL_MEMBER_TEMPLATES
	// 如果可以從_Tp1*轉換為_Tp*,則可以從auto_ptr<_Tp1>構造auto_ptr<_Tp>
	// 同時轉移指針所有權
	template <class _Tp1>
	auto_ptr(auto_ptr<_Tp1>& __a) __STL_NOTHROW
		: _M_ptr(__a.release()) {}
#endif /* __STL_MEMBER_TEMPLATES */
 
	// 賦值操作符,同樣是非const引用傳參,有證同測試③
	auto_ptr& operator=(auto_ptr& __a) __STL_NOTHROW {
		// 如果是自我賦值,就直接返回
		if (&__a != this) {
			delete _M_ptr;
			_M_ptr = __a.release();
		}
		return *this;
	}
 
#ifdef __STL_MEMBER_TEMPLATES
	// 賦值操作符的Member Function Templates
	template <class _Tp1>
	auto_ptr& operator=(auto_ptr<_Tp1>& __a) __STL_NOTHROW {
		if (__a.get() != this->get()) {
			delete _M_ptr;
			_M_ptr = __a.release();
		}
		return *this;
	}
#endif /* __STL_MEMBER_TEMPLATES */
 
	// Note: The C++ standard says there is supposed to be an empty throw
	// specification here, but omitting it is standard conforming.  Its 
	// presence can be detected only if _Tp::~_Tp() throws, but (17.4.3.6/2)
	// this is prohibited.
	// auto_ptr的析構函數
	~auto_ptr() { delete _M_ptr; }
	// operator*定義,返回值
	_Tp& operator*() const __STL_NOTHROW {
		return *_M_ptr;
	}
	// operator->定義,返回指針
	_Tp* operator->() const __STL_NOTHROW {
		return _M_ptr;
	}
	// const成員函數get定義,返回指針
	_Tp* get() const __STL_NOTHROW {
		return _M_ptr;
	}
	// release函數定義,釋放指針
	_Tp* release() __STL_NOTHROW {
		_Tp* __tmp = _M_ptr;
		_M_ptr = 0;
		return __tmp;
	}
	// reset函數定義,重置指針
	void reset(_Tp* __p = 0) __STL_NOTHROW {
		if (__p != _M_ptr) {
			delete _M_ptr;
			_M_ptr = __p;
		}
	}
 
	// According to the C++ standard, these conversions are required.  Most
	// present-day compilers, however, do not enforce that requirement---and, 
	// in fact, most present-day compilers do not support the language 
	// features that these conversions rely on.
 
#if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \
	defined(__STL_MEMBER_TEMPLATES)
 
public:
	// 從auto_ptr_ref<_Tp>構造auto_ptr<_Tp>
	auto_ptr(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW
		: _M_ptr(__ref._M_ptr) {}
	// 從auto_ptr_ref<_Tp>對auto_ptr<_Tp>進行賦值操作。
	// 注意這里是普通傳參,沒有引用④
	auto_ptr& operator=(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW {
		if (__ref._M_ptr != this->get()) {
			delete _M_ptr;
			_M_ptr = __ref._M_ptr;
		}
		return *this;
	}
	// 成員函數模板(Member Function Templates)②
	// 如果可以從_Tp*轉換為_Tp1*,則可以從auto_ptr<_Tp>轉換為auto_ptr_ref<_Tp1>
	template <class _Tp1> operator auto_ptr_ref<_Tp1>() __STL_NOTHROW 
	{ return auto_ptr_ref<_Tp1>(this->release()); }
	// 成員函數模板(Member Function Templates)②
	// 如果可以從_Tp*轉換為_Tp1*,則可以從auto_ptr<_Tp>轉換為auto_ptr<_Tp1>
	template <class _Tp1> operator auto_ptr<_Tp1>() __STL_NOTHROW
	{ return auto_ptr<_Tp1>(this->release()); }
 
#endif /* auto ptr conversions && member templates */
};
 
__STL_END_NAMESPACE
 
#endif /* __SGI_STL_MEMORY */
 
// Local Variables:
// mode:C++
// End:

注解:
①auto_ptr_ref結構體
我們看到,auto_ptr源代碼中的Copy構造函數的參數是普通的引用傳參(不是const引用,也不是普通的傳值),這是為了方便指針擁有權的轉移(如果是const引用,那么擁有權無法轉移;如果是普通的傳值,oh my god,整個世界都徹底混亂了)。那如果以一個臨時對象(也就是所謂的右值)進行拷貝構造,那樣就無法通過編譯了(普通指針或引用不能指向const對象,即不能指向右值)。幸好有auto_ptr_ref的存在,可以從auto_ptr_ref臨時對象構造或者賦值為auto_ptr對象:

1
2
3
4
5
6
7
8
9
10
11
12
13
public:
	// 從auto_ptr_ref<_Tp>構造auto_ptr<_Tp>
	auto_ptr(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW
		: _M_ptr(__ref._M_ptr) {}
	// 從auto_ptr_ref<_Tp>對auto_ptr<_Tp>進行賦值操作。
	// 注意這里是普通傳參,沒有引用④
	auto_ptr& operator=(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW {
		if (__ref._M_ptr != this->get()) {
			delete _M_ptr;
			_M_ptr = __ref._M_ptr;
		}
		return *this;
	}

而auto_ptr對象也可以隱式的轉化為auto_ptr_ref類型的對象:

1
2
	template <class _Tp1> operator auto_ptr_ref<_Tp1>() __STL_NOTHROW 
	{ return auto_ptr_ref<_Tp1>(this->release()); }

于是乎,就完美的完成了auto_ptr從右值到左值的轉換工作。也可以看這里:為什么需要auto_ptr_ref
成員函數模板(Member Function Templates)
③證同測試,見《Effective C++》條款11:在operator= 中處理“自我賦值” (Item 11. handle assignment to self in operator=)
④見①

原創文章,轉載請注明:
本文出自程序人生 >> STL auto_ptr智能指針簡單分析
作者:代碼瘋子

posted on 2011-10-09 10:53 LoveBeyond 閱讀(2691) 評論(4)  編輯 收藏 引用

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

導航

統計

留言簿(1)

文章分類

搜索

積分與排名

最新評論

閱讀排行榜

評論排行榜

友情鏈接:C++博客 LoveBeyond 代碼瘋子 程序人生 C++技術博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲成色精品| 亚洲高清精品中出| 在线视频中文亚洲| 欧美精品网站| 99热这里只有成人精品国产| 欧美成人精品激情在线观看| 久久国产色av| 精品成人在线视频| 欧美成ee人免费视频| 可以看av的网站久久看| 亚洲国产成人精品久久| 欧美激情第4页| 欧美精品日韩| 亚洲欧美激情诱惑| 午夜亚洲性色视频| 国产亚洲欧美日韩美女| 久热综合在线亚洲精品| 你懂的视频欧美| 一区二区三区四区在线| 亚洲一级黄色片| 一区在线视频| 91久久精品久久国产性色也91| 欧美日韩视频免费播放| 亚洲欧美另类在线| 久久精品夜色噜噜亚洲aⅴ | 亚洲欧洲日韩综合二区| 欧美日韩精品二区| 久久大香伊蕉在人线观看热2| 久久久久高清| 一本一本久久| 久久精彩免费视频| 亚洲精品在线观| 午夜精品av| 亚洲精品免费一二三区| 亚洲专区一区| 9久re热视频在线精品| 亚洲一区二区影院| 亚洲大黄网站| 亚洲一区视频在线| 伊人狠狠色丁香综合尤物| 亚洲精品国精品久久99热一| 国产亚洲精品久久飘花| 亚洲经典三级| 激情欧美亚洲| 亚洲午夜激情在线| 亚洲精品日韩一| 欧美在线观看视频在线| 亚洲手机在线| 欧美成人免费视频| 久久精品国产精品亚洲精品| 欧美视频一区二区三区…| 鲁大师成人一区二区三区| 国产精品国产三级国产aⅴ无密码| 欧美96在线丨欧| 国产精品一区二区三区免费观看| 亚洲国产欧美日韩| 国产综合婷婷| 亚洲欧美视频在线观看| aa日韩免费精品视频一| 狂野欧美激情性xxxx欧美| 欧美一级大片在线免费观看| 欧美午夜激情视频| 亚洲精品国精品久久99热一| 亚洲国产成人久久| 欧美在线精品免播放器视频| 欧美一区2区视频在线观看 | 久久精品99| 久久爱另类一区二区小说| 欧美性做爰猛烈叫床潮| 亚洲精品久久久久久久久久久久| 亚洲国产精品第一区二区| 久久黄色网页| 欧美成人午夜激情| 在线观看福利一区| 久久成人一区二区| 久久久蜜臀国产一区二区| 国产美女精品视频免费观看| 亚洲一区二区在线看| 亚洲欧美国产精品va在线观看| 欧美色道久久88综合亚洲精品| 亚洲卡通欧美制服中文| 一本色道久久综合亚洲精品按摩| 欧美人成在线视频| 亚洲美女电影在线| 亚洲一区二区毛片| 国产精品盗摄久久久| 亚洲深夜av| 久久精品国产亚洲一区二区| 韩国成人福利片在线播放| 麻豆精品视频在线观看视频| 亚洲国产日韩在线一区模特| 一本色道久久88亚洲综合88| 国产精品国产三级国产普通话三级| 日韩天堂在线视频| 亚洲欧美在线磁力| 国产一区二区三区高清| 麻豆精品视频在线观看视频| 日韩视频在线免费观看| 亚洲欧美日韩一区二区三区在线观看| 国产伦精品一区二区三区免费| 久久精品毛片| 最新日韩欧美| 香蕉国产精品偷在线观看不卡| 狠狠色丁香婷综合久久| 欧美承认网站| 亚洲欧美视频一区二区三区| 欧美不卡高清| 午夜国产不卡在线观看视频| 亚洲高清资源综合久久精品| 欧美日韩三级电影在线| 午夜在线不卡| 亚洲精品国产精品国自产观看浪潮| 午夜宅男欧美| 亚洲黄网站黄| 国产尤物精品| 欧美日韩成人| 久久九九国产| 亚洲少妇在线| 亚洲福利电影| 久久人人爽国产| 亚洲一区二区三| 91久久精品国产91性色| 国产视频自拍一区| 欧美伦理a级免费电影| 久久精品国产亚洲一区二区三区| 日韩视频久久| 欧美超级免费视 在线| 欧美一区三区三区高中清蜜桃| 日韩一二三区视频| 韩日精品视频| 国产三区精品| 国产精品成人一区二区| 麻豆精品在线观看| 欧美在线地址| 午夜精品久久久久影视| 日韩一区二区精品视频| 亚洲第一色在线| 美女图片一区二区| 久久精品国产亚洲aⅴ| 亚洲一区一卡| 亚洲午夜精品一区二区三区他趣| 亚洲国产裸拍裸体视频在线观看乱了 | 欧美成人资源网| 久久久久久久999精品视频| 午夜亚洲视频| 午夜亚洲影视| 亚洲欧美成人| 亚洲欧美视频一区| 亚洲影视在线| 午夜精品福利电影| 亚洲一区视频在线观看视频| 亚洲免费伊人电影在线观看av| 艳妇臀荡乳欲伦亚洲一区| 亚洲人成亚洲人成在线观看| 亚洲欧洲日本在线| 亚洲精品美女91| 日韩一级网站| 亚洲午夜羞羞片| 亚洲一区二区在线播放| 亚洲综合导航| 久久国产欧美精品| 久久精品三级| 麻豆成人在线播放| 欧美成人午夜剧场免费观看| 欧美激情第五页| 亚洲精品精选| 亚洲免费综合| 久久精品国产亚洲一区二区三区| 久久综合给合久久狠狠狠97色69| 久久亚洲精品网站| 欧美高清日韩| 欧美性猛交xxxx乱大交蜜桃| 国产日韩成人精品| 国产真实久久| 亚洲人体1000| 亚洲淫片在线视频| 久久久精彩视频| 亚洲高清一区二| 在线视频日韩| 久久躁日日躁aaaaxxxx| 欧美精品一区二区视频 | 欧美高清视频免费观看| 欧美日韩一区二区三区免费| 国产精品资源在线观看| 在线看片一区| 午夜精品久久久久久久99热浪潮| 久久网站免费| 亚洲青色在线| 久久爱www.| 欧美视频在线观看 亚洲欧| 国产精品视频成人| 亚洲国产视频一区| 亚洲男人av电影| 亚洲国产91| 欧美一二三视频| 欧美日韩人人澡狠狠躁视频| 欲香欲色天天天综合和网| 亚洲小视频在线观看| 免费观看国产成人| 亚洲婷婷综合久久一本伊一区|