2021-05-12 11:00:58
記憶體洩露的解決辦法
什麼是記憶體漏失(memory leak)?
指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體漏失並非指記憶體在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。
操作方法
-
01
case 1.new/delete成對使用
case 2.正確的清理巢狀的物件指標。
解決辦法:
a、在外部函數分配的堆記憶體,不要在呼叫函數裡面釋放,而應該在外部函數釋放。
b、儘量在建構函式中分配記憶體。
c、在基礎類別/繼承類中分管各自的記憶體。 -
02
case 3 釋放物件陣列時,要使用delete []
a、對單個物件、基本型別的變數,用delete;
b、對基本型別陣列,採用delete,delete[]均可;
c、對自定義的物件的所組成的物件陣列,一定要採用delete []. -
03
case 4 指向物件的指標構成的陣列,必須使用者自己呼叫delete。
for example:
Point **pPtrAry = new Point*[10]; // 迴圈為每個指標分配一個Point物件; int i = 0; for (; i < 10; ++i) { pPtrAry[i] = new Point(i, i, "Green"); }
// 下面語句並沒有釋放10個Point物件,釋放的只是他們的指標所組成的陣列 // 佔用的10*sizeof(Point*) 空間,造成了記憶體洩露 // (180 = 10*sizeof(Point) + 10* 6; (6= sizeof("Green")))// delete []pPtrAry;
// 正確的方法: for (i = 0; i < 10; ++i) { delete pPtrAry[i]; } delete []pPtrAry; // 或者delete pPtrAry; -
04
case 5 對於有指標物件的類,必須有顯示的拷貝建構函式。
-
05
case 6 必要的過載賦值運運算元。
-
06
case 7 基礎類別的解構函式定義為虛擬函式。
-
07
這裡主要存在基礎類別指標指向派生類的情況。如果解構函式定義為虛擬函式,則釋放基礎類別指標時,如果該指標指向一個派生類,則會先呼叫派生類的解構函式,再呼叫基礎類別的解構函式(不管是不是虛擬函式,派生類的物件解構的時候,都會先呼叫派生類的解構函式,再呼叫基礎類別的解構函式)。
-
08
最後以下是怎樣避免記憶體洩露:
良好的編碼習慣,儘量在涉及記憶體的程式段,檢測出記憶體洩露。當程式穩定之後,在來檢測記憶體洩露時,無疑增加了排除的困難和複雜度。使用了記憶體分配的函數,要記得要使用其想用的函數釋放掉,一旦使用完畢。 - End
相關文章
-
7+2強化供電!599元梅捷SY-狂龍H510M圖賞
除了廣為人知的Z590和B560之外,英特爾還發布了入門級的H510晶片組,也是上一代H410晶片組的升級版。 在相容性方面,H510晶片組與Z590晶片組和B560晶片組沒有什麼區別,都可以相容1
2021-05-10 19:00:28
-
支援5333高頻記憶體!技嘉小雕PRO B560M主機板圖賞
Intel第十一代酷睿已經上市,新架構帶來了巨大的IPC提升幅度,同時,Intel還開放了B560/H570主機板的記憶體超頻功能,這使得主流玩家也可以輕鬆享受高頻記憶體帶來的流暢遊戲體驗。
2021-05-09 16:00:04
-
24K純金!微星MEG Z590 ACE GOLD EDITION戰神至臻圖賞
顯示卡、散熱器、風扇都能玩RGB,機箱中,主機板幾乎是最不起眼的存在。 而近日,微星推出了一款亮眼的主機板,首次用上了24K純金設計,它就是MEG Z590 ACE戰神至臻,一起來瞧瞧。 MEG
2021-05-07 22:00:14