用彙編的眼光看C (之delete記憶體洩露)21

2022-03-24 15:23:51 字數 3024 閱讀 8870

有過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 對硬體進行某種特殊的操作,比如說關中斷等,這在核心級的 中是比較常見的。但是我們講究嵌入式彙編的一些基本點和大家一起討論一下,建議大家和我一起做實驗,用事實...