在VC中提供內存檢查的機制是跟蹤new操作,也就是說所有的new操作都會被記錄,如果通過new操作所分配的內存未被正常delete將會在程序退出時在調試窗口中顯示出具體的內存洩露信息。
同樣通過malloc分配的內存也會被跟蹤,但是在顯示時就不會知道實在程序中何處進行了malloc操作。先看一下下面的例子:
void _tmain()
{ ...
char *pszNew=(char*)malloc(200);
char *pszNew2=new char[100];
CString *pszNew3=new CString("test");
...
}
//通過調試方式運行後並退出,可以看到調試信息中關於內存洩露的信息如下:
Detected memory leaks!
Dumping objects ->
strcore.cpp(118) : {37} normal block at 0x007702E0, 17 bytes long.
Data: < test> 01 00 00 00 04 00 00 00 04 00 00 00 74 65 73 74
G: emp2sam_sp_33sam_sp_33.cpp(42) : {36} normal block at 0x00770520, 4 bytes long.
Data: < w > EC 02 77 00
//對於CString *pszNew3=new CString("test");產生的信息
G: emp2sam_sp_33sam_sp_33.cpp(41) : {35} normal block at 0x00770320, 100 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
//對於char *pszNew2=new char[100];產生的信息
{34} normal block at 0x007703B0, 200 bytes long.
Data: < > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD
//對於char *pszNew=(char*)malloc(200);產生的信息
Object dump complete.
可以看到通過new分配的內存在顯示信息時會報告出在那一個文件的那一行進行的new操作,而通過malloc分配的內存則僅僅是顯示出內存洩露的信息而無法定位分配內存的程序位置。
此外如果需要在文件頭部定義DEBUG_NEW宏才可以正確的跟蹤new操作。具體代碼如下:
#ifdef _DEBUG
#define new DEBUG_NEW
#endif
由於對new操作的跟蹤只需要在調試版本中出現所以使用了條件編譯。
我們可以看到VC所提供的檢查內存洩露的方式是非常易於使用的,我們在開發程序時一定要注意內存的分配問題,特別是對於一些長時間運行的程序。