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

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)  編輯 收藏 引用

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

導航

統計

留言簿(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>
            亚洲一区二区免费看| 欧美日韩精品一区二区| 欧美国产精品劲爆| 久久中文精品| 免费成人小视频| 最新亚洲电影| 亚洲美女在线观看| 午夜精品久久久久久久白皮肤| 欧美在线电影| 欧美国产精品专区| 国产精品一区二区久激情瑜伽| 国产亚洲精品一区二区| 亚洲第一在线综合在线| 日韩视频在线一区二区三区| 亚洲欧美影院| 欧美承认网站| 在线亚洲高清视频| 久久久精品国产一区二区三区| 欧美插天视频在线播放| 国产精品美女999| 久久久青草婷婷精品综合日韩| 亚洲欧美一区二区三区极速播放| 久久av一区| 欧美日韩在线视频一区二区| 国产视频一区在线| 日韩午夜在线电影| 久久视频在线视频| 夜夜狂射影院欧美极品| 久久亚洲春色中文字幕| 欧美日韩一区二区精品| 韩国久久久久| 欧美一区二区三区四区夜夜大片| 亚洲国产精品va在看黑人| 香港久久久电影| 欧美日韩在线播放| 亚洲精品视频在线观看免费| 久久精品一区二区三区不卡| 一区二区三区久久久| 欧美成人一区在线| 尤妮丝一区二区裸体视频| 亚洲欧美日韩国产成人| 亚洲精品国产精品国自产观看浪潮| 欧美一区亚洲一区| 国产女主播一区| 亚洲欧美激情一区二区| 亚洲美女av电影| 欧美二区在线| 亚洲国产精品999| 六月婷婷一区| 久久精品国产99国产精品| 国产目拍亚洲精品99久久精品 | 欧美va天堂在线| 韩国一区二区三区在线观看| 午夜在线视频一区二区区别| 一本大道久久a久久精二百| 欧美激情精品久久久久久免费印度| 影音欧美亚洲| 理论片一区二区在线| 欧美在线免费视屏| 精品动漫3d一区二区三区免费版| 久久久久在线观看| 久久九九有精品国产23| 黄色精品免费| 免费成人性网站| 免费成人性网站| 亚洲免费电影在线观看| 亚洲精品久久久久| 欧美午夜宅男影院在线观看| 亚洲欧洲av一区二区三区久久| 亚洲天堂视频在线观看| 国产久一道中文一区| 久久亚洲精品网站| 免费成人黄色| 亚洲一区二区三区视频| 亚洲欧美日韩另类精品一区二区三区| 国产精品高潮久久| 久久久水蜜桃| 欧美国产日韩精品免费观看| 一区二区三区日韩精品视频| 久久久99精品免费观看不卡| 亚洲欧美日韩国产一区二区| 国产亚洲欧洲一区高清在线观看| 久久亚洲高清| 欧美另类videos死尸| 午夜精品福利一区二区三区av| 亚洲综合欧美日韩| 伊人夜夜躁av伊人久久| 亚洲欧洲精品成人久久奇米网 | 亚洲成人在线网| 欧美视频一区二区三区在线观看| 午夜精品久久久99热福利| 久久久久网址| 亚洲图片你懂的| 久久九九精品| 亚洲一区二区视频| 玖玖综合伊人| 香蕉久久一区二区不卡无毒影院| 久久九九久久九九| 亚洲中字黄色| 欧美v日韩v国产v| 欧美一乱一性一交一视频| 老司机久久99久久精品播放免费 | 亚洲视频电影图片偷拍一区| 久久成人亚洲| 亚洲一区二区三区在线| 久久五月天婷婷| 午夜视频一区二区| 欧美高清视频一区二区| 久久亚洲综合色一区二区三区| 欧美精品色综合| 毛片av中文字幕一区二区| 国产精品美女一区二区在线观看 | 欧美中文字幕在线观看| 在线视频欧美日韩| 欧美不卡在线| 欧美粗暴jizz性欧美20| 国产欧美欧洲在线观看| 亚洲美女91| 日韩午夜电影| 欧美成人亚洲成人日韩成人| 免费短视频成人日韩| 国内成+人亚洲| 欧美一区二区黄色| 久久黄色网页| 国产日韩欧美精品| 亚洲一区二区视频在线| 亚洲一区二区三区在线观看视频| 欧美剧在线观看| 亚洲国产精品一区二区www在线| 伊人狠狠色j香婷婷综合| 欧美一区日本一区韩国一区| 欧美亚洲免费电影| 国产精品入口福利| 亚洲摸下面视频| 欧美在线视频一区二区三区| 国产精品入口夜色视频大尺度| 中文网丁香综合网| 国产一区二区三区四区在线观看| 亚洲国产视频一区| 亚洲人成人一区二区三区| 狼人天天伊人久久| 男人的天堂亚洲在线| 在线成人中文字幕| 久久综合婷婷| 最新国产精品拍自在线播放| 日韩一二三区视频| 欧美午夜不卡视频| 亚洲一区欧美二区| 久久久夜夜夜| 亚洲国产你懂的| 欧美精品免费播放| 一本色道久久综合亚洲二区三区| 亚洲愉拍自拍另类高清精品| 国产农村妇女毛片精品久久麻豆| 性欧美18~19sex高清播放| 久久久久久免费| 亚洲激情视频在线| 欧美日韩亚洲不卡| 亚洲欧美影院| 欧美国产日韩视频| 亚洲综合不卡| 在线视频观看日韩| 欧美日韩精品免费| 欧美一区二区三区四区在线观看地址 | 欧美日本韩国一区| 亚洲欧美中文日韩在线| 欧美二区在线| 亚洲欧美激情四射在线日 | 狠色狠色综合久久| 欧美成年人在线观看| 亚洲一区二区三区欧美| 久久久欧美一区二区| 亚洲裸体俱乐部裸体舞表演av| 国产精品乱码妇女bbbb| 久久裸体艺术| 亚洲无吗在线| 亚洲福利在线视频| 久久精品国产99| 中文在线不卡视频| 亚洲大黄网站| 国产欧美一区二区三区久久人妖| 欧美国产免费| 久久久久在线观看| 亚洲视频在线一区| 亚洲激情综合| 久久视频精品在线| 亚洲欧美一区二区原创| 日韩视频免费观看高清在线视频| 国产午夜精品一区理论片飘花| 欧美日韩一区三区| 欧美黄色日本| 欧美成人精品1314www| 欧美专区一区二区三区| 亚洲午夜女主播在线直播| 亚洲日本免费电影| 欧美大片第1页| 免费观看成人| 老牛国产精品一区的观看方式| 亚洲欧美综合国产精品一区| 在线亚洲欧美视频|