最近項目中使用boost庫的智能指針,感覺智能指針還是蠻強大的,在此貼出自己學習過程中編寫的測試代碼,以供其他想了解boost智能指針的朋友參考,有講得不正确之處歡迎指出讨論。當然,使用boost智能指針首先要編譯boost庫,具體方法可以網上查詢,在此不再贅述。
智能指針能夠使C++的開發簡單化,主要是它能夠自動管理記憶體的釋放,而且能夠做更多的事情,即使用智能指針,則可以再代碼中new了之後不用delete,智能指針自己會幫助你管理記憶體資源的釋放。
Boost庫的智能指針有很多種,下面通過示例代碼來說明其中share_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
<code>/ test.cpp : Defines the entry point </code><code>for</code> <code>the console application.</code>
<code>#include "stdafx.h"</code>
<code>#include <iostream></code>
<code>#include <boost/shared_ptr.hpp></code>
<code>#include <vector></code>
<code>/** 測試類 */</code>
<code>class</code> <code>CTest</code>
<code>{</code>
<code>public</code><code>: </code>
<code> </code>
<code> </code><code>/** 構造函數 */</code>
<code> </code><code>CTest(</code><code>int</code> <code>m)</code>
<code> </code><code>{</code>
<code> </code><code>m_member = m;</code>
<code> </code><code>/** 申請空間 */</code>
<code> </code><code>m_pname = </code><code>new</code> <code>char</code><code>[2];</code>
<code> </code><code>}</code>
<code> </code><code>/** 析構函數 */</code>
<code> </code><code>~CTest()</code>
<code> </code><code>delete</code> <code>m_pname;</code>
<code> </code><code>/** 成員函數 */</code>
<code> </code><code>int</code> <code>getMember()</code>
<code> </code><code>return</code> <code>m_member;</code>
<code>private</code><code>:</code>
<code> </code><code>/** 資料成員 */</code>
<code> </code><code>int</code> <code>m_member;</code>
<code> </code><code>char</code> <code>* m_pname;</code>
<code> </code>
<code>};</code>
<code>int</code> <code>_tmain(</code><code>int</code> <code>argc, _TCHAR* argv[])</code>
<code>/** 示例代碼【1】 */</code>
<code> </code><code>/** boost::shared_ptr智能指針含有一個引用計數器 */</code>
<code> </code><code>/** 引用指針計數器記錄有多少個引用指針指向同一個對象,如果最後一個引用指針被銷毀的時候,那麼就銷毀對象本身。 */</code>
<code> </code><code>/** 使用智能指針建立一個對象 */</code>
<code> </code><code>/** 注意: 智能指針不支援直接 new 例如: boost::shared_ptr<CTest> pTemp = new CTest(2) 是錯誤的 */</code>
<code> </code><code>boost::shared_ptr<CTest> pTemp(</code><code>new</code> <code>CTest(10));</code>
<code> </code><code>/** 建立一個新的智能指針也指向新建立的CTest對象 */</code>
<code> </code><code>/** 智能指針支援等号操作 */</code>
<code> </code><code>boost::shared_ptr<CTest> pSecond = pTemp;</code>
<code> </code><code>/** 通過智能指針通路該對象 */</code>
<code> </code><code>std::cout << pTemp->getMember() << std::endl;</code>
<code> </code><code>/** 讓第一個智能指針為空,不再指向該對象,注意,智能指針不能使用 pTemp = NULL */</code>
<code> </code><code>pTemp.reset();</code>
<code> </code><code>/** 讓第二個智能指針也為空,這時該CTest對象已經沒有智能指針指向它了,會自動析構 */</code>
<code> </code><code>pSecond.reset();</code>
<code>/** 示例代碼【2】 */</code>
<code> </code><code>/** 将一個普通的指針轉換為智能指針 */</code>
<code> </code><code>/** 建立一個普通的指針,new一個對象 */</code>
<code> </code><code>CTest * pATest = </code><code>new</code> <code>CTest(100);</code>
<code> </code><code>/** 轉換為智能指針 */</code>
<code> </code><code>boost::shared_ptr<CTest> pShareTest(pATest);</code>
<code> </code><code>/** 智能指針會自動管理建立的CTest對象,不允許再進行delete,否則程式會挂掉 */</code>
<code> </code><code>delete</code> <code>pATest;</code>
<code> </code><code>/** 讓智能指針為空,則對象會被自動析構 */</code>
<code> </code><code>pShareTest.reset();</code>
<code>/** 示例代碼【3】 */</code>
<code> </code><code>/** 建立一個容器存放智能指針 */</code>
<code> </code><code>/** 這裡需要注意: 兩個“ > ” 不要寫到一起了,否則會産生 >> 運算符重載 */</code>
<code> </code><code>std::vector<boost::shared_ptr<CTest> > vec;</code>
<code> </code><code>/** 建立一個臨時的CTest對象,存放到上面的容器 */</code>
<code> </code><code>/** 使用智能指針建立一個對象 */</code>
<code> </code><code>boost::shared_ptr<CTest> pTemp(</code><code>new</code> <code>CTest(2));</code>
<code> </code><code>/** 添加到容器中 */</code>
<code> </code><code>vec.push_back(pTemp);</code>
<code> </code><code>/** 離開大括号,則pTemp析構,于是隻有容器中的指針指向了新建立的CTest */</code>
<code> </code><code>/** 讓vector疊代器指向剛剛push_back到容器中的智能指針 */</code>
<code> </code><code>std::vector<boost::shared_ptr<CTest> >::iterator itor = vec.begin();</code>
<code> </code><code>/** 通路智能指針, (*itor)即為智能指針對象,指向了剛才建立的CTest,通過 -> 方法通路CTest對象 */</code>
<code> </code><code>std::cout << (*itor)->getMember()<<std::endl;</code>
<code> </code><code>/** 清空容器,在容器被清空時,容器中的智能指針被删除,</code>
<code> </code><code>由于此時已經沒有智能指針指向該對象,故該CTest對象會自動析構 */</code>
<code> </code><code>vec.clear();</code>
<code> </code><code>int</code> <code>temp;</code>
<code> </code><code>std::cin >> temp;</code>
<code> </code><code>return</code> <code>0;</code>
<code>}</code>
<code>/** 使用智能指針需要注意的地方 */</code>
<code>// 1. 智能指針其實是一種類對象,并不是簡單的指針,故當智能指針包含另一個類的對象時,</code>
<code>// 需要包含另一個類的頭檔案,而不能簡單的使用前向引用聲明</code>
<code>// eg: CMyClass.h檔案</code>
<code> </code><code>#include </code><code>"CTest.h"</code>
<code> </code><code>/** 不能簡單地使用前向引用聲明,必須包含頭檔案 */</code>
<code> </code><code>// 前向引用聲明 class CTest</code>
<code> </code>
<code>class</code> <code>CMyClass</code>
<code>public</code><code>:</code>
<code> </code><code>boost::shared_ptr<CTest> m_pTest;</code>
<code>// 2. shared_ptr 是線程安全的</code>
<code>// 3. 使用智能指針出現循環引用的情況</code>
<code>// 即兩個類互相含有對方類對象的智能指針</code>
<code>// 看下面這一篇文章Boost智能指針——weak_ptr</code>
<code>網址: </code>
<code>http:</code><code>//www.cnblogs.com/TianFang/archive/2008/09/20/1294590.html</code>
本文轉自 Jhuster 51CTO部落格,原文連結:http://blog.51cto.com/ticktick/196765,如需轉載請自行聯系原作者