平常編寫C代碼時,如果忘記釋放已分配的內存,就會造成內存泄漏,這時我們有兩種方法確認造成內存泄漏的位置,第一種是直接檢查代碼中所有涉及到內存分配的地方是否最後都進行釋放了,這種方法的缺點在於在代碼量較大時手工檢查工作量較大,如果使用了第三方庫,一方面我們可能對庫何時分配了內存不甚瞭解,另一方面單獨檢查每個分配內存的函數也較爲繁瑣。第二種方法是藉助 Visual Studio 調試器和 C 運行時 (CRT) 庫。使用方法如下:
#define _CRTDBG_MAP_ALLOC
#include "stdlib.h"
#include <crtdbg.h>
#ifdef _DEBUG
#ifndef DBG_NEW
#define DBG_NEW new ( _NORMAL_BLOCK , __FILE__ , __LINE__ )
#define new DBG_NEW
#endif
#endif // _DEBUG
int main()
{
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
char *p = (char *)malloc(sizeof(char) * 10);
return 0;
}
定義相關的宏,包含頭文件crtdbg.h,在主函數最前面調用_CrtSetDbgFlag函數,將項目配置爲debug模式,最後按F5即可,此時可以看到下方輸出中顯示了內存泄露的大小,內存泄漏代碼所在行數和對應內存的前16個字節值,如下圖:
參考: