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

LoveBeyond

STL auto_ptr智能指針簡(jiǎn)單分析

程序人生 >> STL auto_ptr智能指針簡(jiǎn)單分析:a
uto_ptr是STL里面的智能指針(Smart Pointer)
,一個(gè)很好的優(yōu)點(diǎn)就是指針?biāo)袡?quán)自動(dòng)轉(zhuǎn)移和指針自動(dòng)刪除技術(shù)。對(duì)于異常和經(jīng)常忘記delete的情況來(lái)說(shuō)很實(shí)用。
下面就是從SGI官方網(wǎng)站轉(zhuǎn)載的STL auto_ptr實(shí)現(xiàn)源碼(加上了我的注釋):
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轉(zhuǎn)換以及支持成員函數(shù)模板
#if defined(__SGI_STL_USE_AUTO_PTR_CONVERSIONS) && \
	defined(__STL_MEMBER_TEMPLATES)
// 定義auto_ptr_ref template結(jié)構(gòu)體①
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修飾構(gòu)造函數(shù),防止從原始指針隱式轉(zhuǎn)換
	explicit auto_ptr(_Tp* __p = 0) __STL_NOTHROW : _M_ptr(__p) {}
	// Copy構(gòu)造函數(shù),注意這里是直接引用傳參(非const),同時(shí)轉(zhuǎn)移指針?biāo)袡?quán)
	auto_ptr(auto_ptr& __a) __STL_NOTHROW : _M_ptr(__a.release()) {}
 
// 如果允許定義成員函數(shù)模板(Member Function Templates)②
#ifdef __STL_MEMBER_TEMPLATES
	// 如果可以從_Tp1*轉(zhuǎn)換為_Tp*,則可以從auto_ptr<_Tp1>構(gòu)造auto_ptr<_Tp>
	// 同時(shí)轉(zhuǎn)移指針?biāo)袡?quán)
	template <class _Tp1>
	auto_ptr(auto_ptr<_Tp1>& __a) __STL_NOTHROW
		: _M_ptr(__a.release()) {}
#endif /* __STL_MEMBER_TEMPLATES */
 
	// 賦值操作符,同樣是非const引用傳參,有證同測(cè)試③
	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的析構(gòu)函數(shù)
	~auto_ptr() { delete _M_ptr; }
	// operator*定義,返回值
	_Tp& operator*() const __STL_NOTHROW {
		return *_M_ptr;
	}
	// operator->定義,返回指針
	_Tp* operator->() const __STL_NOTHROW {
		return _M_ptr;
	}
	// const成員函數(shù)get定義,返回指針
	_Tp* get() const __STL_NOTHROW {
		return _M_ptr;
	}
	// release函數(shù)定義,釋放指針
	_Tp* release() __STL_NOTHROW {
		_Tp* __tmp = _M_ptr;
		_M_ptr = 0;
		return __tmp;
	}
	// reset函數(shù)定義,重置指針
	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>構(gòu)造auto_ptr<_Tp>
	auto_ptr(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW
		: _M_ptr(__ref._M_ptr) {}
	// 從auto_ptr_ref<_Tp>對(duì)auto_ptr<_Tp>進(jìn)行賦值操作。
	// 注意這里是普通傳參,沒有引用④
	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;
	}
	// 成員函數(shù)模板(Member Function Templates)②
	// 如果可以從_Tp*轉(zhuǎn)換為_Tp1*,則可以從auto_ptr<_Tp>轉(zhuǎn)換為auto_ptr_ref<_Tp1>
	template <class _Tp1> operator auto_ptr_ref<_Tp1>() __STL_NOTHROW 
	{ return auto_ptr_ref<_Tp1>(this->release()); }
	// 成員函數(shù)模板(Member Function Templates)②
	// 如果可以從_Tp*轉(zhuǎn)換為_Tp1*,則可以從auto_ptr<_Tp>轉(zhuǎn)換為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結(jié)構(gòu)體
我們看到,auto_ptr源代碼中的Copy構(gòu)造函數(shù)的參數(shù)是普通的引用傳參(不是const引用,也不是普通的傳值),這是為了方便指針擁有權(quán)的轉(zhuǎn)移(如果是const引用,那么擁有權(quán)無(wú)法轉(zhuǎn)移;如果是普通的傳值,oh my god,整個(gè)世界都徹底混亂了)。那如果以一個(gè)臨時(shí)對(duì)象(也就是所謂的右值)進(jìn)行拷貝構(gòu)造,那樣就無(wú)法通過編譯了(普通指針或引用不能指向const對(duì)象,即不能指向右值)。幸好有auto_ptr_ref的存在,可以從auto_ptr_ref臨時(shí)對(duì)象構(gòu)造或者賦值為auto_ptr對(duì)象:

1
2
3
4
5
6
7
8
9
10
11
12
13
public:
	// 從auto_ptr_ref<_Tp>構(gòu)造auto_ptr<_Tp>
	auto_ptr(auto_ptr_ref<_Tp> __ref) __STL_NOTHROW
		: _M_ptr(__ref._M_ptr) {}
	// 從auto_ptr_ref<_Tp>對(duì)auto_ptr<_Tp>進(jìn)行賦值操作。
	// 注意這里是普通傳參,沒有引用④
	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對(duì)象也可以隱式的轉(zhuǎn)化為auto_ptr_ref類型的對(duì)象:

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

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

原創(chuàng)文章,轉(zhuǎn)載請(qǐng)注明:
本文出自程序人生 >> STL auto_ptr智能指針簡(jiǎn)單分析
作者:代碼瘋子

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

<2025年12月>
30123456
78910111213
14151617181920
21222324252627
28293031123
45678910

導(dǎo)航

統(tǒng)計(jì)

留言簿(1)

文章分類

搜索

積分與排名

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

友情鏈接:C++博客 LoveBeyond 代碼瘋子 程序人生 C++技術(shù)博客
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            久久理论片午夜琪琪电影网| 欧美成人免费va影院高清| 91久久精品日日躁夜夜躁欧美 | 亚洲人精品午夜| 欧美激情第六页| 欧美成人一区二区在线| 亚洲乱码日产精品bd| 亚洲国产欧美在线| 欧美日韩色综合| 亚洲专区国产精品| 亚洲欧美一区二区激情| 国产综合久久| 欧美激情一区二区三区在线| 欧美高清不卡在线| 亚洲欧美日韩一区在线观看| 欧美一二区视频| 91久久一区二区| 在线亚洲成人| 在线播放不卡| 日韩小视频在线观看| 国产亚洲永久域名| 欧美激情一区二区三区高清视频| 欧美日韩国产欧| 久久天天狠狠| 欧美日韩精品免费在线观看视频| 欧美在线一二三| 欧美精品1区2区3区| 欧美一区观看| 欧美精品福利| 久久资源在线| 欧美网站在线观看| 免费在线成人av| 欧美午夜视频在线| 欧美激情1区2区3区| 国产精品yjizz| 欧美激情一区三区| 国产欧美视频一区二区| 亚洲激情欧美激情| 激情一区二区三区| 夜夜狂射影院欧美极品| 亚洲第一精品影视| 亚洲欧美一区二区三区在线| 日韩午夜在线视频| 久久久久久久波多野高潮日日| 亚洲新中文字幕| 欧美黄色小视频| 蜜臀久久99精品久久久画质超高清| 国产精品捆绑调教| 亚洲美女av在线播放| 亚洲大片av| 久久激情婷婷| 久久精品国产亚洲a| 国产精品红桃| 日韩午夜免费| 亚洲视频你懂的| 欧美成年人视频网站欧美| 久久婷婷国产综合精品青草| 国产精品色在线| 中文av一区二区| 亚洲天堂成人在线视频| 欧美精品1区2区| 亚洲国产欧美日韩精品| 亚洲大胆女人| 久久深夜福利免费观看| 久久夜色精品亚洲噜噜国产mv | 亚洲欧美日韩爽爽影院| 亚洲综合社区| 国产精品色婷婷| 亚洲午夜精品一区二区三区他趣| 亚洲天堂av综合网| 国产精品久久77777| 99国产精品久久| 亚洲欧美另类在线| 国产精品入口尤物| 亚洲欧美日本日韩| 久久国产黑丝| 在线播放中文字幕一区| 久久综合九色综合网站| 欧美成人综合在线| 日韩视频二区| 欧美视频久久| 午夜精品www| 欧美 日韩 国产在线| 亚洲国产精品久久久久久女王| 欧美成年人视频| 夜夜嗨av一区二区三区四区| 欧美一区二区视频免费观看| 国产一区二区中文字幕免费看| 久久久www| 亚洲精品视频在线看| 亚洲你懂的在线视频| 国产在线拍揄自揄视频不卡99| 久久综合久久综合久久综合| 亚洲国产成人在线| 亚洲欧美日韩国产综合在线 | 久久久噜噜噜久噜久久| 免费亚洲电影在线| 99re热精品| 国产色产综合产在线视频| 久久久综合网站| 日韩亚洲不卡在线| 久久九九热re6这里有精品| 亚洲国产黄色片| 国产精品成人va在线观看| 欧美中文在线观看国产| 最新亚洲一区| 久久久www成人免费无遮挡大片| 亚洲大片一区二区三区| 欧美视频免费在线观看| 久久综合色8888| 亚洲天堂av综合网| 欧美国产乱视频| 欧美一区影院| 中国女人久久久| 在线精品视频在线观看高清 | 久久精品一区| 这里只有精品丝袜| 欧美成人午夜激情| 久久国产手机看片| 一区二区三区视频免费在线观看| 韩国女主播一区二区三区| 欧美日韩视频专区在线播放 | 久久婷婷激情| 亚洲综合大片69999| 亚洲激情视频网站| 麻豆视频一区二区| 午夜欧美视频| 在线亚洲观看| 99精品久久免费看蜜臀剧情介绍| 国内精品免费在线观看| 国产精品区一区| 欧美日韩一二三区| 欧美精品一区二区蜜臀亚洲| 久久全国免费视频| 欧美在线不卡| 欧美一区成人| 午夜精品一区二区三区在线| 一区二区三区偷拍| 99riav国产精品| 99精品99久久久久久宅男| 亚洲激情黄色| 亚洲国产精品女人久久久| 免费在线观看精品| 免费视频一区| 欧美黄色aa电影| 欧美二区在线观看| 欧美高清免费| 亚洲国产精品va在线看黑人| 欧美电影在线观看完整版| 欧美成年网站| 欧美激情麻豆| 亚洲精品女人| 欧美电影免费观看| 亚洲第一精品久久忘忧草社区| 欧美成人激情视频免费观看| 欧美国产精品人人做人人爱| 亚洲盗摄视频| 亚洲精品在线三区| 在线亚洲美日韩| 亚洲视频碰碰| 久久国产精品网站| 麻豆国产精品一区二区三区| 欧美激情中文字幕在线| 国产精品草莓在线免费观看| 国产精品久在线观看| 国产亚洲福利| 亚洲国产99| 亚洲天堂免费在线观看视频| 先锋影院在线亚洲| 久久夜色精品国产欧美乱极品| 牛人盗摄一区二区三区视频| 亚洲人成网站777色婷婷| 一区二区三区欧美成人| 性色av一区二区三区红粉影视| 久久午夜精品一区二区| 欧美日韩视频第一区| 国产伦精品一区二区三区免费| 在线观看欧美日本| 亚洲视频一区| 久久综合九色综合久99| 亚洲人成在线观看网站高清| 亚洲欧美国产精品专区久久| 久久躁日日躁aaaaxxxx| 国产精品va| 亚洲福利视频网站| 香蕉久久精品日日躁夜夜躁| 欧美福利专区| 午夜精品久久久久久久| 欧美韩国在线| 国产专区欧美精品| 亚洲性夜色噜噜噜7777| 免费视频一区| 亚洲欧美变态国产另类| 欧美久久久久| 精品99一区二区| 欧美一区二视频| 99re8这里有精品热视频免费 | 亚洲国产天堂网精品网站| 亚洲欧美日韩精品在线| 欧美日韩ab|