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

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

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

導航

統計

留言簿(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>
            欧美不卡高清| 欧美夜福利tv在线| 美女视频一区免费观看| 亚洲一区在线免费| 亚洲国产欧美一区二区三区久久| 欧美视频中文字幕在线| 欧美 日韩 国产一区二区在线视频 | 在线亚洲国产精品网站| 在线观看成人一级片| 国产色综合久久| 国产精品久久久久久久7电影 | 99视频一区| 亚洲国产综合91精品麻豆| 国产日韩精品在线观看| 国产精品国产三级国产专区53| 欧美精品粉嫩高潮一区二区 | 国产精品区一区| 国产精品xnxxcom| 欧美日韩国产欧| 欧美精品午夜| 欧美久久久久久蜜桃| 免费在线一区二区| 久久久精品日韩| 久久久久99| 久久久久久久久久久久久女国产乱 | 久久这里有精品15一区二区三区 | 亚洲国产精品v| 免费成人高清在线视频| 久久综合色天天久久综合图片| 欧美自拍偷拍| 欧美在线91| 久久国产精品网站| 久久青草久久| 久久天天综合| 久久综合久久综合这里只有精品 | 免费成人av| 久久夜色精品国产噜噜av| 久久久国产一区二区三区| 久久成人免费| 麻豆精品网站| 欧美国产精品劲爆| 欧美日韩三级在线| 国产精品第一区| 国产精品专区h在线观看| 国产精品综合网站| 国内精品国产成人| 一色屋精品视频免费看| 亚洲福利视频二区| 日韩视频不卡中文| 亚洲自拍偷拍麻豆| 欧美中文在线免费| 老司机67194精品线观看| 女人天堂亚洲aⅴ在线观看| 亚洲第一综合天堂另类专| 亚洲国产精品一区二区尤物区 | 国产精品日韩一区二区三区| 国产乱肥老妇国产一区二| 国产最新精品精品你懂的| 亚洲国产精品一区二区www在线| 亚洲精品免费一二三区| 亚洲欧美成人一区二区在线电影| 久久99在线观看| 麻豆成人在线| 亚洲精品久久在线| 午夜精品三级视频福利| 久久最新视频| 国产精品第一区| 一区视频在线| 亚洲视频在线观看免费| 久久精品中文字幕免费mv| 欧美国产日本| 亚洲午夜成aⅴ人片| 久久久久久久高潮| 国产精品jvid在线观看蜜臀| 精品成人国产| 亚洲一二三级电影| 奶水喷射视频一区| 中日韩高清电影网| 久久亚洲精品一区| 国产精品久久久久毛片软件| 亚洲福利国产精品| 性欧美暴力猛交另类hd| 欧美福利视频一区| 亚洲欧美日韩电影| 欧美精品在线观看| 国内精品亚洲| 亚洲欧美国产一区二区三区| 欧美激情按摩| 欧美亚洲专区| 欧美特黄视频| 最新日韩欧美| 久久久久久久久蜜桃| 日韩亚洲视频在线| 狼人社综合社区| 国产欧美精品一区二区三区介绍| 亚洲精品乱码久久久久久黑人 | 亚洲韩国青草视频| 久久精品国产99国产精品| 欧美性开放视频| 亚洲精品午夜精品| 美日韩免费视频| 性做久久久久久| 欧美午夜电影一区| 亚洲精品日韩在线| 男人天堂欧美日韩| 亚洲欧美在线网| 国产精品国色综合久久| 亚洲精品一区在线观看| 另类亚洲自拍| 欧美一区在线看| 国产精品自拍一区| 欧美亚洲免费在线| 正在播放欧美视频| 欧美日韩国产成人在线免费| 亚洲第一级黄色片| 玖玖在线精品| 欧美一级理论性理论a| 国产精品国产三级国产aⅴ入口| 99精品久久免费看蜜臀剧情介绍| 欧美成人免费全部观看天天性色| 欧美亚洲综合在线| 国产欧美一区二区三区另类精品| 亚洲在线不卡| 一二三区精品福利视频| 欧美日韩国产成人在线| 日韩亚洲在线观看| 亚洲精品一区二区三区av| 欧美福利网址| 日韩视频在线一区| 亚洲高清123| 欧美大片免费观看在线观看网站推荐| 在线色欧美三级视频| 牛夜精品久久久久久久99黑人| 久久久久久色| 亚洲国产精品久久久久秋霞不卡| 欧美成人久久| 欧美国产日韩一区| 亚洲小说区图片区| 亚洲自拍偷拍网址| 国产色婷婷国产综合在线理论片a| 欧美一区深夜视频| 欧美主播一区二区三区| 黑人巨大精品欧美黑白配亚洲 | 亚洲美洲欧洲综合国产一区| 亚洲黄页一区| 国产精品videosex极品| 香蕉久久久久久久av网站| 性欧美video另类hd性玩具| 国产在线精品自拍| 欧美暴力喷水在线| 欧美日韩精品免费观看视频| 亚洲综合日韩中文字幕v在线| 亚洲一区二区在线视频| 国产一区二区精品久久91| 久久综合九色九九| 欧美精品七区| 欧美亚洲一区二区在线| 久久久www成人免费精品| 亚洲免费观看高清完整版在线观看| 日韩亚洲精品电影| 国产人久久人人人人爽| 欧美大片在线看免费观看| 欧美日韩不卡合集视频| 欧美一区二区三区日韩视频| 久久五月天婷婷| 中文av字幕一区| 欧美在线资源| 一本久道综合久久精品| 亚洲欧美日韩精品一区二区| 在线日本成人| 在线综合+亚洲+欧美中文字幕| 国产亚洲成精品久久| 亚洲国产三级| 国产资源精品在线观看| 亚洲国产三级| 国产一区二区三区最好精华液| 欧美黑人在线播放| 国产精品视频第一区| 欧美激情久久久| 国产视频在线观看一区| 亚洲国产精品传媒在线观看| 国产精品视频区| 亚洲国产精品福利| 国产在线日韩| 一本色道久久综合亚洲精品高清 | 亚洲国内高清视频| 亚洲人成7777| 国产午夜精品久久| 亚洲精品护士| 亚洲福利视频一区| 午夜国产一区| 一区二区三区欧美亚洲| 久久久久久一区二区三区| 亚洲一区国产| 欧美阿v一级看视频| 久久久精品免费视频| 国产精品www994| 亚洲日韩视频| 亚洲国产精选| 久久精品国产69国产精品亚洲 |