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

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 閱讀(2691) 評論(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>
            欧美黄色免费网站| 欧美日韩精品系列| 狠狠久久综合婷婷不卡| 久久精品视频免费观看| 久久gogo国模啪啪人体图| 伊人精品在线| 亚洲国产视频直播| 欧美日韩免费观看一区二区三区 | 亚洲资源在线观看| 国产精品一区二区黑丝| 久久九九免费视频| 欧美 日韩 国产精品免费观看| 亚洲第一页自拍| 亚洲精品小视频| 国产欧美日韩综合一区在线观看 | 欧美大片91| 欧美日韩一区二区高清| 欧美亚洲一级| 欧美激情bt| 久久精品一区二区国产| 欧美国产免费| 久久国产精品免费一区| 欧美va亚洲va日韩∨a综合色| 一区二区三区日韩欧美| 欧美一区二区啪啪| 亚洲精品看片| 欧美在线资源| 中文日韩电影网站| 久久成人在线| 亚洲少妇中出一区| 久久亚洲欧美国产精品乐播| 在线一区二区视频| 久久九九有精品国产23| 亚洲视屏在线播放| 美玉足脚交一区二区三区图片| 亚洲自拍偷拍一区| 免费观看在线综合色| 欧美在线你懂的| 欧美日韩一区二区高清| 欧美岛国在线观看| 国产亚洲综合在线| 一区二区三区三区在线| 亚洲精品综合在线| 久久这里只精品最新地址| 午夜综合激情| 欧美天天综合网| 亚洲精品少妇30p| 1024精品一区二区三区| 性欧美在线看片a免费观看| 99精品国产福利在线观看免费| 久久久精品一区| 久久精品夜色噜噜亚洲a∨| 欧美网站大全在线观看| 亚洲精品资源美女情侣酒店| 最新中文字幕亚洲| 久久夜色撩人精品| 久久三级视频| 激情一区二区三区| 久久久.com| 麻豆精品精华液| 在线看片成人| 美日韩免费视频| 亚洲国产精品久久人人爱蜜臀| 亚洲国产小视频在线观看| 久久精品国产免费观看| 久久久午夜电影| 一区二区三区在线视频观看| 久久国产一区二区| 欧美11—12娇小xxxx| 在线看片成人| 欧美丰满少妇xxxbbb| 亚洲电影免费观看高清完整版在线观看 | 国产欧美日韩另类视频免费观看 | 久久五月天婷婷| 一区国产精品| 欧美成人在线免费视频| 亚洲欧洲久久| 亚洲婷婷国产精品电影人久久| 欧美日韩国产在线观看| 中文av字幕一区| 久久久久久久久久久一区| 在线观看91精品国产麻豆| 裸体一区二区| 一本高清dvd不卡在线观看| 亚洲欧美日韩综合aⅴ视频| 国产精品日韩欧美一区二区三区| 午夜在线电影亚洲一区| 美腿丝袜亚洲色图| 亚洲视频在线播放| 国产情侣久久| 免费影视亚洲| 亚洲无亚洲人成网站77777| 久久精品国产69国产精品亚洲 | 欧美日韩综合网| 欧美一区久久| 亚洲精品123区| 久久国产精品毛片| 亚洲日本无吗高清不卡| 国产精品久久久久久超碰 | 一区二区三区不卡视频在线观看 | 亚洲欧美大片| 欧美激情bt| 欧美在线中文字幕| 亚洲三级影片| 国产真实精品久久二三区| 麻豆av福利av久久av| 亚洲影视在线播放| 欧美黄色一级视频| 欧美中文在线观看国产| 99在线精品观看| 一区二区在线免费观看| 国产精品美女xx| 欧美激情视频免费观看| 欧美一级片久久久久久久| 最新日韩精品| 欧美成人精品在线观看| 欧美一区在线看| 一区二区三区免费在线观看| 一区二区亚洲欧洲国产日韩| 国产精品高潮呻吟| 欧美激情精品久久久久久变态| 欧美一级成年大片在线观看| 99视频一区二区三区| 亚洲福利久久| 麻豆91精品91久久久的内涵| 亚洲欧美在线一区| 亚洲少妇诱惑| 一片黄亚洲嫩模| 99re6热只有精品免费观看| 亚洲国产成人av| 一区一区视频| 国内揄拍国内精品久久| 国产伦精品一区二区三区四区免费 | 亚洲精品乱码久久久久久日本蜜臀| 国产偷久久久精品专区| 国产精品hd| 国产精品盗摄一区二区三区| 欧美精品亚洲一区二区在线播放| 久久天堂国产精品| 欧美在线观看www| 欧美在线啊v| 久久国产精品72免费观看| 亚洲男人的天堂在线| 中文欧美在线视频| 99国内精品久久| 日韩视频免费观看高清在线视频 | 亚洲一区精彩视频| 中文欧美日韩| 亚洲欧美在线免费| 性欧美1819sex性高清| 午夜精品视频| 欧美在线视频一区二区| 久久av资源网| 另类成人小视频在线| 久久久水蜜桃| 免费观看亚洲视频大全| 欧美激情一二三区| 亚洲精品久久久蜜桃| aa日韩免费精品视频一| 亚洲午夜黄色| 久久av一区二区| 免费观看久久久4p| 欧美日韩日本国产亚洲在线| 欧美午夜性色大片在线观看| 国产精品视频第一区| 国产视频亚洲精品| 在线观看视频亚洲| 一本色道久久88亚洲综合88| 亚洲欧美一区在线| 狼狼综合久久久久综合网| 欧美高清视频| 亚洲社区在线观看| 欧美一乱一性一交一视频| 免费成人在线视频网站| 欧美日韩一级大片网址| 国产一区二区精品久久| 亚洲精品一区二区在线| 午夜精品福利一区二区三区av| 久久成人一区二区| 欧美激情精品久久久久久变态| 日韩视频在线免费| 久久精品青青大伊人av| 欧美日本国产| 国产尤物精品| 99国产一区| 久久性色av| 亚洲一本视频| 麻豆freexxxx性91精品| 国产精品―色哟哟| 日韩视频中午一区| 久久一区国产| 亚洲专区欧美专区| 欧美高清视频免费观看| 国产日韩欧美在线看| 99视频精品在线| 免费美女久久99| 欧美一区二区免费观在线| 欧美日韩在线播放三区四区| 在线观看亚洲视频啊啊啊啊| 午夜精品久久久久久久久久久久|