內存泄漏通常是因為調用了malloc/new等內存申請操作,但是缺少了對應的free/delete。
可以用Linux環境下的內存泄漏檢查工具Valgrind;
或者寫代碼時,添加內存申請和釋放的統計功能,統計當前申請和釋放內存是否一致;
使用Boost庫的智能指針。
內存泄漏分類:
- 堆內存泄漏:沒有free/delete釋放
2.系統資源泄漏:主要指程序使用系統分配的資源比如 Bitmap,handle,SOCKET等沒有使用相應的函數釋放掉 - 沒有將基類的析構函數定義為虛函數。當基類指針指向子類對象時,如果基類的析構函數不是virtual,那么子類的析構函數將不會被調用,子類的資源沒有正確的釋放,從而造成內存泄漏。
內存泄漏工具Valgrind
檢查內存泄漏工具---memcheck,這是valgrind應用最廣泛的工具,一個重量級的內存檢查器,能夠發現開發中絕大多數內存錯誤使用情況,比如:使用未初始化的內存,使用已經釋放了的內存,內存訪問越界等
指令:valgrind --tool=memcheck --leak-check=full ./test
Memcheck將內存泄露分為兩種,一種是可能的內存泄露(Possibly lost),另外一種是確定的內存泄露(Definitely lost)。
Possibly lost 是指仍然存在某個指針能夠訪問某塊內存,但該指針指向的已經不是該內存首地址。
Definitely lost 是指已經不能夠訪問這塊內存。而Definitely lost又分為兩種:直接的(direct)和間接的(indirect)。直接和間接的區別就是,直接是沒有任何指針指向該內存,間接是指指向該內存的指針都位于內存泄露處。