什么是內(nèi)存泄漏(memory leak)免绿?
指由于疏忽或錯(cuò)誤造成程序未能釋放已經(jīng)不再使用的內(nèi)存的情況。內(nèi)存泄漏并非指內(nèi)情人q存在物理上的消失擦盾,而是應(yīng)用程序分配某段內(nèi)存后嘲驾,由于設(shè)計(jì)錯(cuò)誤淌哟,失去了對該段內(nèi)存的控制,因而造成了內(nèi)存的浪費(fèi)
我們主要關(guān)注兩種類型的內(nèi)存泄漏:
? 堆內(nèi)存泄漏(Heap leak)辽故。對內(nèi)存指的是程序運(yùn)行中根據(jù)需要分配通過malloc,realloc new等從堆中分配的一塊內(nèi)存徒仓,再是完成后必須通過調(diào)用對應(yīng)的 free或者delete 刪掉。如果程序的設(shè)計(jì)的錯(cuò)誤導(dǎo)致這部分內(nèi)存沒有被釋放誊垢,那么此后這塊內(nèi)存將不會被使用掉弛,就會產(chǎn)生Heap Leak.
系統(tǒng)資源泄露(Resource Leak).主要指程序使用系統(tǒng)分配的資源比如 Bitmap,handle ,SOCKET等沒有使用相應(yīng)的函數(shù)釋放掉,導(dǎo)致系統(tǒng)資源的浪費(fèi)喂走,嚴(yán)重可導(dǎo)致系統(tǒng)效能降低殃饿,系統(tǒng)運(yùn)行不穩(wěn)定。
如何解決內(nèi)存泄露芋肠?
內(nèi)存泄露的問題其困難在于
1.編譯器不能發(fā)現(xiàn)這些問題
2.運(yùn)行時(shí)才能捕獲到這些錯(cuò)誤乎芳,這些錯(cuò)誤沒有明顯的癥狀,時(shí)隱時(shí)現(xiàn)业栅。
3.對于手機(jī)等終端開發(fā)用戶來說秒咐,尤為困難。下面從三個(gè)方面來解決內(nèi)存泄露:
第一碘裕,良好的編碼習(xí)慣携取,盡量在涉及內(nèi)存的程序段,檢測出內(nèi)存泄露帮孔。當(dāng)程式穩(wěn)定之后雷滋,在來檢測內(nèi)存泄露時(shí),無疑增加了排除的困難和復(fù)雜度文兢。
使用了內(nèi)存分配的函數(shù)晤斩,要記得要使用其想用的函數(shù)釋放掉,一旦使用完畢姆坚。
第二澳泵,重載? new 和 delete。這也是大家編碼過程中常常使用的方法兼呵。
其主要思路是將分配的內(nèi)存以鏈表的形式自行管理兔辅,使用完畢之后從鏈表中刪除,程序結(jié)束時(shí)可檢查改鏈表击喂,其中記錄了內(nèi)存泄露的文件维苔,所在文件的行數(shù)以及泄露的大小哦。
第三懂昂,Boost 中的smart pointer(待完善介时,結(jié)合大家的建議)
第四,一些常見的工具插件