有過c語言程式設計的朋友大多知道,如果在malloc記憶體之後不及時free掉記憶體,那麼很有可能會造成記憶體洩露的。那麼在c++上面,是不是也存在這樣 的問題呢?結果是c++上面同樣也存在記憶體洩露的危險。這個危險就是如果new後面不能delete的話,也會造成記憶體的洩露。還有不清楚的朋友可以看看 下面的示例:
[cpp]view plain
copy
class
test
~test() {};
};
void
process()
delete
t;
return
; }
上面的**在一定程度上說明了問題。其實上面這段**在函式返回的時候已經考慮到了記憶體刪除的問題,但是關鍵是如果在error發生的時候,沒有及時處 理的話也會造成記憶體洩露的。那麼有沒有什麼好的方法呢?大家可以看看c++有沒有什麼性質可以保證函式在結束的時候可以自動完成資源的釋放。對,那就是析 構函式。所以,一般的話我們可以新增乙個額外的類定義。
[cpp]view plain
copy
class
auto_point
~auto_point()
};
但是,原來我們的好多操作都是按照指標進行的,那麼怎麼把類轉變成指標呢?那就只有使用算術符過載了。
[cpp]view plain
copy
class
auto_point
~auto_point()
test* operator->()
const
test& operator* ()
};
[cpp]view plain
copy
22: auto_point p(
newtest(0));
004010ad push 4
004010af call operator new
(00401300)
004010b4 add esp,4
004010b7 mov dword ptr [ebp-18h],eax
004010ba mov dword ptr [ebp-4],0
004010c1 cmp dword ptr [ebp-18h],0
004010c5 je process+56h (004010d6)
004010c7 push 0
004010c9 mov ecx,dword ptr [ebp-18h]
004010cc call @ilt+80(test::test) (00401055)
004010d1 mov dword ptr [ebp-1ch],eax
004010d4 jmp process+5dh (004010dd)
004010d6 mov dword ptr [ebp-1ch],0
004010dd mov eax,dword ptr [ebp-1ch]
004010e0 mov dword ptr [ebp-14h],eax
004010e3 mov dword ptr [ebp-4],0ffffffffh
004010ea mov ecx,dword ptr [ebp-14h]
004010ed push ecx
004010ee lea ecx,[ebp-10h]
004010f1 call @ilt+65(auto_point::auto_point) (00401046)
004010f6 mov dword ptr [ebp-4],1
23: if
(1)
004010fd mov edx,1
00401102 test edx,edx
00401104 je process+97h (00401117)
24:
27:
28: return
; 00401117 mov dword ptr [ebp-4],0ffffffffh
0040111e lea ecx,[ebp-10h]
00401121 call @ilt+75(auto_point::~auto_point) (00401050)
29: }
大家可以從上面的**看得很清楚,不管**在什麼時候退出,函式都會利用類的基本特性,自動呼叫類的析構函式,那麼進而記憶體就會得到釋放,不會發生記憶體 洩露的問題。但是我們發現上面的解決方案也有不足的地方,就是每乙個類都需要額外定義乙個額外的定義類。那麼有沒有什麼辦法解決這一問題呢?那就是模板 了。
[cpp]view plain
copy
template
<
typename
type>
class
auto_point
~auto_point()
test* operator->()
const
test& operator* ()
};
如果我們的型別不是特定的,那麼我們只需要在使用的時候按照特定的型別輸入即可。
【預告: 下面的一篇部落格會介紹類成員指標拷貝的問題】
用彙編的眼光看C (之嵌入彙編)
嵌入式彙編是對純彙編檔案的一種有益補充。通常會有下面幾種情況使用到彙編 1 提高 的工作效率 使用到cpu的一些特殊指令,比如說mmx指令 2 對硬體進行某種特殊的操作,比如說關中斷等,這在核心級的 中是比較常見的。但是我們講究嵌入式彙編的一些基本點和大家一起討論一下,建議大家和我一起做實驗,用事實...
用彙編的眼光看C (之嵌入彙編)
嵌入式彙編是對純彙編檔案的一種有益補充。通常會有下面幾種情況使用到彙編 1 提高 的工作效率 使用到cpu的一些特殊指令,比如說mmx指令 2 對硬體進行某種特殊的操作,比如說關中斷等,這在核心級的 中是比較常見的。但是我們講究嵌入式彙編的一些基本點和大家一起討論一下,建議大家和我一起做實驗,用事實...
用彙編的眼光看C (之嵌入彙編)
嵌入式彙編是對純彙編檔案的一種有益補充。通常會有下面幾種情況使用到彙編 1 提高 的工作效率 使用到cpu的一些特殊指令,比如說mmx指令 2 對硬體進行某種特殊的操作,比如說關中斷等,這在核心級的 中是比較常見的。但是我們講究嵌入式彙編的一些基本點和大家一起討論一下,建議大家和我一起做實驗,用事實...