內(nèi)存泄漏通常是因為調(diào)用了malloc/new等內(nèi)存申請操作龙亲,但是缺少了對應(yīng)的free/delete锨阿。
可以用Linux環(huán)境下的內(nèi)存泄漏檢查工具Valgrind;
或者寫代碼時交惯,添加內(nèi)存申請和釋放的統(tǒng)計功能,統(tǒng)計當(dāng)前申請和釋放內(nèi)存是否一致穿仪;
使用Boost庫的智能指針席爽。
內(nèi)存泄漏分類:
- 堆內(nèi)存泄漏:沒有free/delete釋放
2.系統(tǒng)資源泄漏:主要指程序使用系統(tǒng)分配的資源比如 Bitmap,handle啊片,SOCKET等沒有使用相應(yīng)的函數(shù)釋放掉 - 沒有將基類的析構(gòu)函數(shù)定義為虛函數(shù)只锻。當(dāng)基類指針指向子類對象時,如果基類的析構(gòu)函數(shù)不是virtual紫谷,那么子類的析構(gòu)函數(shù)將不會被調(diào)用齐饮,子類的資源沒有正確的釋放捐寥,從而造成內(nèi)存泄漏。
內(nèi)存泄漏工具Valgrind
檢查內(nèi)存泄漏工具---memcheck祖驱,這是valgrind應(yīng)用最廣泛的工具握恳,一個重量級的內(nèi)存檢查器,能夠發(fā)現(xiàn)開發(fā)中絕大多數(shù)內(nèi)存錯誤使用情況捺僻,比如:使用未初始化的內(nèi)存乡洼,使用已經(jīng)釋放了的內(nèi)存,內(nèi)存訪問越界等
指令:valgrind --tool=memcheck --leak-check=full ./test
Memcheck將內(nèi)存泄露分為兩種陵像,一種是可能的內(nèi)存泄露(Possibly lost)就珠,另外一種是確定的內(nèi)存泄露(Definitely lost)。
Possibly lost 是指仍然存在某個指針能夠訪問某塊內(nèi)存醒颖,但該指針指向的已經(jīng)不是該內(nèi)存首地址妻怎。
Definitely lost 是指已經(jīng)不能夠訪問這塊內(nèi)存。而Definitely lost又分為兩種:直接的(direct)和間接的(indirect)泞歉。直接和間接的區(qū)別就是逼侦,直接是沒有任何指針指向該內(nèi)存,間接是指指向該內(nèi)存的指針都位于內(nèi)存泄露處腰耙。