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

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

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

導航

統計

留言簿(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>
            国产婷婷97碰碰久久人人蜜臀| 99国产精品久久| 欧美一区二区女人| 国产视频欧美视频| 浪潮色综合久久天堂| 免费观看一级特黄欧美大片| 99国产精品国产精品久久| 日韩午夜电影| 国产午夜精品福利| 免费成人在线视频网站| 欧美日韩大片一区二区三区| 午夜视频一区| 麻豆精品一区二区综合av| 一区二区三区av| 亚洲欧美一级二级三级| 亚洲韩国日本中文字幕| 99精品视频免费全部在线| 国内精品久久久久影院薰衣草| 麻豆成人av| 欧美日韩亚洲综合在线| 久久免费国产精品1| 欧美大色视频| 久久www成人_看片免费不卡| 免费在线亚洲| 久久精品国产一区二区三区| 欧美激情一区二区三区四区 | 欧美成人a视频| 午夜精品久久久久久久99水蜜桃| 久久久人成影片一区二区三区观看 | 国产一区二区毛片| 亚洲精品乱码久久久久久| 国产欧美日韩不卡| 亚洲激情偷拍| 一区二区三区在线观看视频| 一本久道久久综合中文字幕 | 国产精品v日韩精品v欧美精品网站 | 国产老肥熟一区二区三区| 亚洲第一中文字幕在线观看| 国产美女精品人人做人人爽| 亚洲日韩第九十九页| 在线免费不卡视频| 欧美在线电影| 欧美一级在线视频| 欧美日韩亚洲高清| 亚洲国产欧美日韩| 在线成人www免费观看视频| 亚洲欧美一区二区视频| 亚洲一区在线播放| 欧美日韩午夜在线| 最新国产成人在线观看| 亚洲激情视频网站| 久久资源av| 欧美wwwwww| 在线观看日韩| 久久这里有精品视频| 久久亚洲图片| 在线观看成人网| 久久米奇亚洲| 免费美女久久99| 亚洲第一色中文字幕| 蜜臀a∨国产成人精品| 欧美丰满高潮xxxx喷水动漫| 亚洲第一网站免费视频| 久久五月激情| 欧美黄色一区二区| 亚洲日本欧美天堂| 欧美美女福利视频| 一本色道久久综合亚洲二区三区| 国产精品99久久久久久宅男| 欧美日韩国产麻豆| 一区二区三区四区蜜桃| 亚洲欧美日韩精品久久亚洲区| 国产精品美女久久久久久免费| 亚洲在线1234| 久久综合久久综合这里只有精品| 亚洲第一久久影院| 欧美日韩不卡视频| 亚洲一区二区三区在线看| 久久国产精品网站| 亚洲国产精品精华液网站| 欧美黄在线观看| 亚洲视频一区二区在线观看| 欧美在线观看一区二区| 亚洲第一伊人| 欧美午夜视频网站| 欧美中文字幕精品| 最新高清无码专区| 久久成人这里只有精品| 亚洲国产日韩欧美在线99| 欧美日韩精品中文字幕| 欧美一区二区在线免费观看| 欧美激情在线播放| 午夜精品国产| 亚洲国产精品久久久| 欧美午夜激情视频| 久久理论片午夜琪琪电影网| 亚洲日韩欧美视频一区| 久久精品在线播放| 这里只有精品电影| 激情小说另类小说亚洲欧美| 欧美日韩ab| 久久久久在线| 亚洲一区二区三区四区中文| 欧美成ee人免费视频| 欧美一区二区精品在线| 亚洲精品影院在线观看| 国产亚洲精品综合一区91| 欧美韩国一区| 久久精品一二三区| 亚洲图片你懂的| 亚洲国产乱码最新视频| 久久婷婷国产麻豆91天堂| 亚洲一区二区精品| 亚洲精品久久视频| 激情成人av在线| 国产精品毛片a∨一区二区三区| 欧美成人福利视频| 久久亚洲国产成人| 欧美一区二区三区婷婷月色| 在线视频免费在线观看一区二区| 亚洲国产精品综合| 免费成人av在线| 久久久噜久噜久久综合| 午夜精品久久久99热福利| 中文日韩在线| 日韩亚洲国产欧美| 亚洲日本在线观看| 亚洲欧洲另类| 亚洲国产成人不卡| 亚洲电影天堂av| 在线播放精品| 在线观看欧美黄色| 韩国v欧美v日本v亚洲v| 国产资源精品在线观看| 国产偷自视频区视频一区二区| 国产精品一区二区久久国产| 国产精品久久久久aaaa樱花| 欧美手机在线| 国产精品久久久久aaaa九色| 国产精品久久波多野结衣| 欧美日韩一区二区三区在线观看免| 欧美乱在线观看| 欧美视频在线免费| 国产精品欧美在线| 国产日产欧产精品推荐色| 国产深夜精品| 亚洲电影成人| 亚洲精品免费看| 一本色道久久| 午夜精品福利电影| 久久九九99视频| 免费亚洲一区二区| 亚洲国产一区二区视频 | 午夜精品福利一区二区三区av| 午夜日韩福利| 男女av一区三区二区色多| 99综合电影在线视频| 99视频在线精品国自产拍免费观看| 亚洲美女中出| 亚洲欧美在线免费观看| 久久国产色av| 欧美国产欧美亚洲国产日韩mv天天看完整 | 亚洲人成网在线播放| 亚洲美女精品一区| 亚洲午夜未删减在线观看| 久久精品国产v日韩v亚洲| 欧美国产日本高清在线| 国产精品黄视频| 亚洲电影在线看| 亚洲制服av| 噜噜噜91成人网| a4yy欧美一区二区三区| 欧美一区二区| 欧美激情一区二区久久久| 国产模特精品视频久久久久 | 日韩一区二区精品视频| 欧美亚洲一区三区| 欧美大色视频| 亚洲欧美在线免费观看| 欧美黄色免费网站| 国产美女精品在线| 日韩一级黄色av| 久久爱另类一区二区小说| 亚洲国语精品自产拍在线观看| 亚洲主播在线播放| 欧美激情一区二区三区蜜桃视频| 国产女主播在线一区二区| 日韩亚洲欧美一区二区三区| 久久电影一区| 一区二区三区精品视频在线观看| 欧美一级视频| 国产精品男女猛烈高潮激情| 亚洲精品视频免费在线观看| 久久精品国产综合精品| 一区二区三区四区国产| 欧美激情精品久久久六区热门 | 最新日韩欧美| 久久婷婷综合激情| 午夜精品美女久久久久av福利| 欧美日韩一二三四五区|