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

2021-08-17 15:41:24 字數 3017 閱讀 6573

有過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 (之delete記憶體洩露)

有過c語言程式設計的朋友大多知道,如果在malloc記憶體之後不及時free掉記憶體,那麼很有可能會造成記憶體洩露的。那麼在c 上面,是不是也存在這樣的問題呢?結果是c 上面同樣也存在記憶體洩露的危險。這個危險就是如果new後面不能delete的話,也會造成記憶體的洩露。還有不清楚的朋友可以看看下面...

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

有過c語言程式設計的朋友大多知道,如果在malloc記憶體之後不及時free掉記憶體,那麼很有可能會造成記憶體洩露的。那麼在c 上面,是不是也存在這樣的問題呢?結果是c 上面同樣也存在記憶體洩露的危險。這個危險就是如果new後面不能delete的話,也會造成記憶體的洩露。還有不清楚的朋友可以看看下面...

從彙編的眼光看C (之指標拷貝)

指標是程式設計人員的夢魘,對c語言的開發者是如此,對c 的開發者也是如此。特別是在c 中,如果不注意處理類中的指標,非常容易出問題。如果朋友們不相信可以看看下面的 class data int value public data int num 上面的這段問題有沒有什麼問題?大家可以自己先用筆在草稿...