首頁 > 硬體

記憶體洩露的解決辦法

2020-10-09 21:39:23

什麼是記憶體漏失(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

IT145.com E-mail:sddin#qq.com