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

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>
            欧美视频在线观看| **欧美日韩vr在线| 欧美亚洲网站| 亚洲欧美日韩另类| 久久av免费一区| 久久夜色精品国产噜噜av| 久久精品人人做人人爽电影蜜月| 香蕉乱码成人久久天堂爱免费 | 欧美日韩mp4| 欧美午夜激情在线| 国产欧美一区二区精品性| 红桃视频国产一区| 99在线|亚洲一区二区| 亚洲欧美视频一区| 狂野欧美一区| 夜夜爽99久久国产综合精品女不卡| 亚洲视频一区二区| 久久午夜影视| 国产精品福利在线观看| 国产视频丨精品|在线观看| 亚洲第一区中文99精品| 一本色道久久综合一区| 久久久99爱| 亚洲伦理精品| 久久久久久69| 国产精品成人播放| 亚洲欧洲免费视频| 久久精品国产99国产精品澳门| 欧美国产在线电影| 午夜视频在线观看一区二区三区| 欧美成人中文| 影音先锋久久精品| 亚洲一区欧美激情| 亚洲国产欧美另类丝袜| 午夜欧美大尺度福利影院在线看| 欧美99在线视频观看| 国产视频久久久久久久| av成人黄色| 亚洲二区精品| 久久综合色播五月| 日韩一区二区福利| 久久精品在线观看| 国产麻豆精品久久一二三| 99精品国产高清一区二区| 久久午夜精品一区二区| 亚洲淫性视频| 国产精品久久久久久亚洲调教| 亚洲精品激情| 欧美电影免费观看高清完整版| 欧美一区二区啪啪| 国产亚洲人成a一在线v站| 午夜日本精品| 亚洲欧美国产三级| 国产欧美在线观看一区| 欧美一区二区免费观在线| 一区二区成人精品| 国产精品va在线播放我和闺蜜| 99这里只有精品| 亚洲国产小视频| 欧美国产亚洲视频| 一本大道久久a久久精品综合| 亚洲激精日韩激精欧美精品| 欧美多人爱爱视频网站| 日韩视频免费| 99在线观看免费视频精品观看| 欧美日韩精品国产| 亚洲伊人久久综合| 亚洲欧美日韩国产另类专区| 国产日本欧美一区二区三区| 久久精品亚洲乱码伦伦中文| 欧美夜福利tv在线| 亚洲电影在线| 亚洲人午夜精品免费| 欧美日韩亚洲网| 午夜精品国产精品大乳美女| 亚洲欧美在线播放| 亚洲高清免费在线| 日韩视频第一页| 国产精品嫩草99a| 久久久久久久综合日本| 久久综合给合| 在线亚洲一区| 久久国产精彩视频| 亚洲精品久久视频| 亚洲视频中文字幕| 激情六月婷婷久久| 亚洲欧洲一区二区天堂久久| 欧美午夜精品久久久久久超碰| 欧美在线高清| 欧美成人亚洲成人日韩成人| 中文日韩电影网站| 欧美伊人久久大香线蕉综合69| 亚洲国产成人精品视频| 夜色激情一区二区| 黄色亚洲在线| 亚洲视频精品| 亚洲国产一区二区三区高清 | 在线观看亚洲视频| 亚洲美女诱惑| 狠狠色综合色区| 99国产精品视频免费观看一公开| 亚洲欧美在线看| 亚洲精品免费电影| 午夜亚洲影视| 在线亚洲观看| 久久综合色婷婷| 欧美在线免费观看视频| 欧美极品aⅴ影院| 久久影院午夜片一区| 欧美视频日韩| 最新成人av在线| 伊甸园精品99久久久久久| 中文国产成人精品久久一| 亚洲国产一区二区a毛片| 欧美伊人久久久久久久久影院 | 激情欧美一区二区| 99视频有精品| 99国产精品国产精品久久| 久久香蕉精品| 麻豆免费精品视频| 国产一区二区三区四区| 亚洲欧美日韩在线观看a三区| 日韩视频在线观看一区二区| 久久中文字幕导航| 欧美 日韩 国产精品免费观看| 国产偷国产偷精品高清尤物| 亚洲视频网站在线观看| 这里只有精品在线播放| 欧美日本在线一区| 亚洲福利精品| 日韩亚洲欧美综合| 欧美激情中文字幕在线| 亚洲电影激情视频网站| 91久久精品国产91性色tv| 久久综合一区二区| 另类激情亚洲| 亚洲国产高清一区| 欧美成人免费全部| 亚洲欧洲一区二区在线观看| 日韩一区二区精品葵司在线| 欧美精品久久久久久久免费观看| 欧美第一黄色网| 亚洲欧洲在线免费| 欧美精品久久久久久久久老牛影院 | 正在播放亚洲| 久久99在线观看| 国产亚洲欧美日韩美女| 久久久中精品2020中文| 亚洲国产欧美在线人成| 一卡二卡3卡四卡高清精品视频| 欧美日本视频在线| 亚洲图片你懂的| 久久久久国产成人精品亚洲午夜| 激情成人中文字幕| 欧美黑人在线观看| 中文国产成人精品| 老司机久久99久久精品播放免费 | 欧美在线啊v一区| 国产一区在线播放| 麻豆精品视频在线观看| 亚洲精品美女在线观看播放| 在线视频亚洲一区| 国产欧美一区视频| 免费成年人欧美视频| 亚洲欧美久久久久一区二区三区| 欧美午夜影院| 久久久www| 一本久久综合| 久久综合伊人77777麻豆| 亚洲精品久久久久中文字幕欢迎你 | 欧美午夜片在线免费观看| 午夜亚洲视频| 亚洲片在线观看| 久久久久久69| 亚洲神马久久| 亚洲国产99| 国产午夜亚洲精品羞羞网站| 蘑菇福利视频一区播放| 先锋影音久久| 99精品久久免费看蜜臀剧情介绍| 巨乳诱惑日韩免费av| 午夜在线观看免费一区| 亚洲国产日韩欧美| 国产亚洲人成a一在线v站| 欧美日韩免费一区二区三区| 久久久.com| 亚洲专区国产精品| 日韩亚洲国产欧美| 亚洲国产精品123| 久久一本综合频道| 香蕉免费一区二区三区在线观看 | 一本久道久久综合婷婷鲸鱼| 国产美女在线精品免费观看| 欧美日韩午夜在线| 欧美sm重口味系列视频在线观看| 亚洲综合二区| 亚洲一区二区在线免费观看| 亚洲国内精品在线| 欧美成人精品不卡视频在线观看| 久久gogo国模裸体人体|