酷知百科網

位置:首頁 > 遊戲數碼 > 電腦

內存泄露的解決辦法

電腦1.63W

什麼是內存泄漏(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)最後以下是怎樣避免內存泄露:良好的編碼習慣,儘量在涉及內存的程序段,檢測出內存泄露。當程式穩定之後,在來檢測內存泄露時,無疑增加了排除的困難和複雜度。使用了內存分配的函數,要記得要使用其想用的函數釋放掉,一旦使用完畢。