記憶體洩露的解決辦法

來源:酷知科普網 1.59W

什麼是記憶體洩漏(memory leak)?
指由於疏忽或錯誤造成程式未能釋放已經不再使用的記憶體的情況。記憶體洩漏並非指記憶體在物理上的消失,而是應用程式分配某段記憶體後,由於設計錯誤,失去了對該段記憶體的控制,因而造成了記憶體的浪費。

記憶體洩露的解決辦法

操作方法

(01)case 成對使用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)這裡主要存在基類指標指向派生類的情況。如果解構函式定義為虛擬函式,則釋放基類指標時,如果該指標指向一個派生類,則會先呼叫派生類的解構函式,再呼叫基類的解構函式(不管是不是虛擬函式,派生類的物件析構的時候,都會先呼叫派生類的解構函式,再呼叫基類的解構函式)。

記憶體洩露的解決辦法 第2張

(08)最後以下是怎樣避免記憶體洩露:良好的編碼習慣,儘量在涉及記憶體的程式段,檢測出記憶體洩露。當程式穩定之後,在來檢測記憶體洩露時,無疑增加了排除的困難和複雜度。使用了記憶體分配的函式,要記得要使用其想用的函式釋放掉,一旦使用完畢。

熱門標籤