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

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 閱讀(2676) 評(píng)論(4)  編輯 收藏 引用

<2011年10月>
2526272829301
2345678
9101112131415
16171819202122
23242526272829
303112345

導(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>
            99精品国产99久久久久久福利| 牛夜精品久久久久久久99黑人| 性做久久久久久久免费看| 日韩午夜精品视频| 在线亚洲欧美专区二区| 亚洲校园激情| 久久久久国产精品午夜一区| 另类尿喷潮videofree| 欧美福利一区二区| 亚洲精品免费一二三区| 亚洲精品一区二| 亚洲欧美日韩在线观看a三区| 久久精品一二三| 欧美精品麻豆| 国产欧美日韩不卡| 亚洲人成艺术| 欧美一区二区三区在线免费观看 | 午夜精品久久久久久久久| 午夜一区二区三区不卡视频| 久久久久久久999| 欧美日韩国产成人在线免费| 国产欧美日韩激情| av成人毛片| 久久夜色精品国产欧美乱极品| 亚洲日本欧美天堂| 欧美专区在线| 国产精品欧美一区二区三区奶水| 伊人春色精品| 欧美一区二区三区的| 亚洲国产精品久久久久| 性刺激综合网| 国产精品电影观看| 亚洲美女视频网| 久久琪琪电影院| 亚洲视频在线观看网站| 欧美成人在线免费视频| 国产在线高清精品| 亚洲一区www| 欧美激情中文不卡| 久久久97精品| 国产综合久久久久久鬼色| 亚洲综合电影一区二区三区| 欧美激情精品久久久久久大尺度| 性欧美长视频| 国产精品亚洲人在线观看| 一区二区三区成人精品| 亚洲国产日韩在线一区模特| 久久亚洲捆绑美女| 韩国女主播一区| 久久精品国产久精国产思思| 亚洲小说欧美另类婷婷| 亚洲精品日韩在线| 亚洲欧美在线看| 亚洲二区在线观看| 老司机精品视频网站| 精品动漫一区| 蜜桃av综合| 毛片基地黄久久久久久天堂| 在线欧美视频| 亚洲电影免费观看高清完整版在线观看 | 小处雏高清一区二区三区| 一区二区日韩免费看| 欧美日韩在线免费观看| 亚洲影视在线| 亚洲欧美第一页| 国产一区二区久久久| 久久久青草婷婷精品综合日韩| 欧美一区二区精美| 一区三区视频| 91久久极品少妇xxxxⅹ软件| 欧美日韩国产在线观看| 在线视频亚洲欧美| 亚洲一区二区精品在线观看| 国产精品自拍小视频| 久久精品国产久精国产爱| 久久久精品网| 99在线观看免费视频精品观看| 一本久道久久综合中文字幕| 国产精品夜夜夜| 久久久久久亚洲精品中文字幕| 久久福利电影| 亚洲精品午夜| 亚洲视频久久| 好吊色欧美一区二区三区四区| 欧美成人精品在线播放| 欧美高清视频在线播放| 欧美日在线观看| 欧美专区第一页| 久久综合婷婷| 亚洲尤物影院| 狂野欧美一区| 欧美性色综合| 久久一区二区精品| 欧美久久久久久久久久| 欧美专区福利在线| 欧美伦理91| 麻豆精品一区二区综合av| 欧美日韩国产综合一区二区| 久久免费午夜影院| 国产精品久久久久一区二区三区 | 一本久久综合| 在线观看亚洲视频| 亚洲一区一卡| 亚洲欧洲精品一区二区精品久久久 | 亚洲永久免费av| 久久综合给合久久狠狠狠97色69| 亚洲婷婷免费| 午夜精品理论片| 免费视频亚洲| 亚洲一区久久| 麻豆精品视频在线| 久久成人国产| 国产精品久久7| 亚洲黄色一区二区三区| 国产日韩欧美在线视频观看| 日韩视频免费观看高清在线视频| 狠狠色综合色区| 亚洲图片在线观看| 亚洲精品一区中文| 久久天堂av综合合色| 午夜精品久久久久久久久久久久| 欧美激情在线观看| 欧美成人日韩| 在线国产精品播放| 久久久另类综合| 久久精品国产精品亚洲精品| 欧美亚洲第一页| 日韩视频中文字幕| 日韩亚洲国产欧美| 欧美国产三区| 欧美激情一区二区三区| 亚洲高清在线观看一区| 久久久久成人精品| 免费亚洲电影在线| 国产午夜亚洲精品不卡| 在线午夜精品自拍| 午夜精品国产精品大乳美女| 欧美日韩三级视频| 亚洲美女精品久久| 在线视频一区观看| 欧美不卡高清| 99re亚洲国产精品| 亚洲一区久久久| 国产精品极品美女粉嫩高清在线| 一区二区三区久久| 午夜精品福利视频| 黑人一区二区| 欧美国产一区在线| 99视频超级精品| 欧美一区二区三区另类| 狠狠色综合色综合网络| 你懂的一区二区| 99精品国产在热久久| 欧美一级一区| 亚洲大胆av| 国产精品二区影院| 久久久xxx| 日韩一二三区视频| 久久久久在线| 一本色道久久综合亚洲精品高清 | 国一区二区在线观看| 久久亚洲私人国产精品va| 欧美国产日产韩国视频| 亚洲私人黄色宅男| 精久久久久久| 国产精品久99| 欧美福利视频一区| 午夜精品久久久久久久久久久| 久热爱精品视频线路一| 一区二区三区四区在线| 国产一区亚洲| 欧美日韩在线另类| 欧美一区二区三区日韩视频| 你懂的国产精品| 久久综合给合| 亚洲精品日韩综合观看成人91| 欧美视频在线播放| 欧美一区二区三区电影在线观看| 女人色偷偷aa久久天堂| 亚洲永久精品国产| 亚洲国产另类久久久精品极度| 欧美色欧美亚洲另类七区| 久久精品99久久香蕉国产色戒| 亚洲日韩视频| 久久免费高清视频| 亚洲欧美美女| 亚洲美女中文字幕| 狠狠久久婷婷| 国产精品午夜国产小视频| 免费久久99精品国产| 午夜精品视频| 亚洲久久一区二区| 欧美成年网站| 久久精品国产2020观看福利| 一区二区三区四区蜜桃| 免费观看一区| 欧美专区在线观看| 亚洲综合999| 亚洲一级网站| 亚洲婷婷综合久久一本伊一区|