執行緒也是造成記憶體洩露的乙個重要的源頭。執行緒產生記憶體洩露的主要原因在於執行緒生命週期的不可控。
public class threadactivity extends activity
private class mythread extends thread
}private void dosomthing()
}這段**很平常也很簡單,是我們經常使用的形式。
靜態內部類:切斷activity 對於 mythread的強引用。我們思考乙個問題:假設mythread的run函式是乙個很費時的操作,當我們開啟該執行緒後,將裝置的橫屏變為了豎屏,
一般情況下當螢幕轉換時會重新建立activity,按照我們的想法,老的activity應該會被銷毀才對,然而事實上並非如此。
由於我們的執行緒是activity的內部類,所以mythread中儲存了activity的乙個引用,當mythread的run函式沒有結束時,
mythread是不會被銷毀的,因此它所引用的老的activity也不會被銷毀,因此就出現了記憶體洩露的問題。
弱引用: 切斷mythread對於activity 的強引用。
**如下:有些人喜歡用android提供的asynctask,但事實上asynctask的問題更加嚴重,
thread只有在run函式不結束時才出現這種記憶體洩露問題,然而asynctask內部的實現機制是運用了threadpoolexcutor,
該類產生的thread物件的生命週期是不確定的,是應用程式無法控制的,
因此如果asynctask作為activity的內部類,就更容易出現記憶體洩露的問題。
/**
* * 弱引用
*/public abstract class weakasynctaskextends asynctask
@override
protected final void onpreexecute()
}@override
protected final result doinbackground(params... params) else
}@override
protected final void onpostexecute(result result)
}protected void onpreexecute(weaktarget target)
protected abstract result doinbackground(weaktarget target,
params... params);
protected void onpostexecute(weaktarget target, result result)
}
記憶體洩露檢測
c 中檢測記憶體洩漏可以引入系統定義的巨集來檢視,內存在哪個位置洩漏 檔案開始處加入下列定義 define crtdbg map alloc include include 程式退出時加入以下函式 crtdumpmemoryleaks 如果有洩漏會顯示 記憶體洩漏是程式設計中常常見到的乙個問題,我所...
檢測記憶體洩露
程式結束時,作業系統會 程式占用的資源.但是,只要程式還在執行,如果不進行清理,資源最終可能被耗盡.1.vc記憶體洩露檢查工具 visual leak detector 現在已知的最新有2.0版本的,使方法不詳。使用 visual leak detector 2.2.3 在vs工程的linker i...
記憶體洩露檢測
1 包含標頭檔案 include include 2 每個cpp檔案包含 static char this file file define new new normal block,this file,line 3 設定標誌 int tmpdbgflag tmpdbgflag crtsetdbgf...