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

2021-08-26 06:10:20 字數 2579 閱讀 8177

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

class test

~test() {};

};void process()

delete t;

return;

}

上面的**在一定程度上說明了問題。其實上面這段**在函式返回的時候已經考慮到了記憶體刪除的問題,但是關鍵是如果在error發生的時候,沒有及時處理的話也會造成記憶體洩露的。那麼有沒有什麼好的方法呢?大家可以看看c++有沒有什麼性質可以保證函式在結束的時候可以自動完成資源的釋放。對,那就是析構函式。所以,一般的話我們可以新增乙個額外的類定義。

class auto_point

~auto_point()

};

但是,原來我們的好多操作都是按照指標進行的,那麼怎麼把類轉變成指標呢?那就只有使用算術符過載了。

class auto_point

~auto_point()

test* operator->()

const test& operator* ()

};

22:       auto_point p(new test(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

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: }

大家可以從上面的**看得很清楚,不管**在什麼時候退出,函式都會利用類的基本特性,自動呼叫類的析構函式,那麼進而記憶體就會得到釋放,不會發生記憶體洩露的問題。但是我們發現上面的解決方案也有不足的地方,就是每乙個類都需要額外定義乙個額外的定義類。那麼有沒有什麼辦法解決這一問題呢?那就是模板了。

template 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 上面的這段問題有沒有什麼問題?大家可以自己先用筆在草稿...