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

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

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

導航

統計

留言簿(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>
            一区福利视频| 午夜精品福利在线| 久久久综合免费视频| 亚洲尤物影院| 国产欧美日韩亚洲一区二区三区| 亚洲视频精品| 亚洲一区免费视频| 亚洲乱码精品一二三四区日韩在线| 久久在线视频在线| 亚洲女人天堂成人av在线| 国产美女精品视频| 免费在线成人| 欧美黄色日本| 亚洲欧美视频一区二区三区| 农夫在线精品视频免费观看| 一区二区成人精品| 性欧美18~19sex高清播放| 亚洲大胆人体视频| 中日韩美女免费视频网站在线观看| 国产精品一二三| 免费成人黄色av| 国外成人在线| 日韩一二三区视频| 娇妻被交换粗又大又硬视频欧美| 亚洲免费成人av| 一本色道88久久加勒比精品| 亚洲主播在线播放| 亚洲一区二区黄色| 久久婷婷丁香| 欧美伊人久久| 欧美日韩精品免费观看视频| 久久国产精品免费一区| 欧美激情在线免费观看| 久久久久久久久蜜桃| 欧美精品aa| 亚洲精品中文字| 樱花yy私人影院亚洲| 一区二区av在线| 亚洲国产精品电影在线观看| 亚洲一区免费看| 欧美一区二区三区在线观看| 国产一区二区三区四区老人| 一区二区av| 欧美一级久久久久久久大片| 欧美日韩精选| 亚洲一区美女视频在线观看免费| 欧美亚洲一区二区在线| 国内精品模特av私拍在线观看| 亚洲最快最全在线视频| 亚洲激情在线| 久久在线免费观看| 久久精品二区三区| 亚洲成人影音| 欧美色图麻豆| 日韩视频免费| 久久精品国产亚洲a| 亚洲第一搞黄网站| 欧美日韩无遮挡| 日韩视频免费观看高清在线视频| 性一交一乱一区二区洋洋av| 精品91在线| 欧美日产在线观看| 欧美一二三区在线观看| 久久国产精品一区二区三区四区| 在线日韩中文| 欧美午夜激情在线| 在线一区二区视频| 米奇777超碰欧美日韩亚洲| 一区二区高清在线观看| 韩国三级在线一区| 欧美日韩成人一区| 久久精品亚洲| 欧美gay视频| 在线日韩一区二区| 国产精品久久久久久久久久尿 | 欧美一区二区三区免费视| 在线观看日韩精品| 国产精品丝袜91| 欧美高清一区| 浪潮色综合久久天堂| 亚洲永久在线观看| 日韩视频免费观看高清在线视频| 裸体一区二区| 亚洲六月丁香色婷婷综合久久| 国产欧美一区二区精品仙草咪| 欧美高清视频在线| 久色成人在线| 欧美一级免费视频| 亚洲一区自拍| 一区二区高清在线观看| 亚洲国产欧美日韩精品| 欧美激情视频免费观看| 欧美一级大片在线免费观看| 日韩视频精品在线| 亚洲国产成人久久综合| 亚洲嫩草精品久久| 国产日韩欧美精品综合| 久久久蜜桃一区二区人| 亚洲欧洲另类国产综合| 欧美一区激情| 亚洲永久免费观看| 在线日韩精品视频| 一区二区三区中文在线观看| 国产欧美亚洲一区| 国产欧美日韩在线视频| 国产精品日韩一区二区| 国产精品久久久久国产精品日日 | 久久gogo国模啪啪人体图| 亚洲第一页在线| 欧美二区在线| 午夜亚洲影视| 小辣椒精品导航| 欧美一区二区视频在线观看| 性色一区二区| 久久久久久有精品国产| 久久亚裔精品欧美| 欧美aa国产视频| 亚洲福利视频在线| 亚洲伦理自拍| 亚洲视频久久| 午夜一区二区三区在线观看| 午夜欧美不卡精品aaaaa| 欧美一区二区三区啪啪| 久久成人精品无人区| 亚洲免费在线观看| 欧美一区综合| 欧美va亚洲va日韩∨a综合色| 欧美 日韩 国产 一区| 欧美日韩国产一区精品一区| 国产精品国产三级国产普通话99 | 久久精品国产免费观看| 久色婷婷小香蕉久久| 欧美国产日韩一区二区三区| 欧美一级视频免费在线观看| 久久国产视频网| 欧美成人精品一区二区| 亚洲精品免费在线播放| 欧美高清视频免费观看| 亚洲精选在线观看| 亚洲在线一区二区| 久久网站免费| 欧美午夜剧场| 激情亚洲一区二区三区四区| 亚洲欧洲在线一区| 亚洲国产精品成人综合色在线婷婷 | 国产欧美激情| 亚洲国产精品电影| 亚洲一区二区免费看| 久久国产精品99国产| 欧美在线啊v| 亚洲成人在线视频播放 | 国产精品二区在线| 国内一区二区在线视频观看| 亚洲人成网站999久久久综合| 亚洲欧美色婷婷| 亚洲国产成人tv| 午夜精彩视频在线观看不卡| 午夜精品一区二区三区在线| 欧美mv日韩mv国产网站| 欧美视频精品一区| 1000部精品久久久久久久久| 亚洲欧美三级在线| 亚洲人人精品| 久久精视频免费在线久久完整在线看| 欧美日韩精品一区| 亚洲电影免费在线观看| 欧美一级欧美一级在线播放| 亚洲精选中文字幕| 久久一区免费| 国产小视频国产精品| 亚洲视频每日更新| 亚洲国产91精品在线观看| 香蕉久久夜色精品| 国产精品黄色| 在线亚洲一区二区| 亚洲韩国日本中文字幕| 久久精品国产第一区二区三区最新章节 | 亚洲高清自拍| 久久精品二区三区| 亚洲伊人第一页| 欧美亚洲第一页| 在线亚洲一区| 亚洲精品在线免费观看视频| 免费黄网站欧美| 亚洲国内自拍| 蜜桃av一区| 欧美一区二区三区在线| 国产欧美一级| 欧美一区国产在线| 亚洲综合色激情五月| 国产精品啊啊啊| 亚洲欧美国产高清va在线播| 日韩午夜电影av| 欧美日本亚洲韩国国产| 国产精品视频网站| 亚洲欧美成人网| 亚洲视频导航| 国产精品久久久久免费a∨大胸| 宅男噜噜噜66国产日韩在线观看| 最近中文字幕日韩精品 |