VS2010的C++內存泄露檢測

2264 人瀏覽 | 時間: 2016-06-01 16:50:28 | 作者: wujunwei

  對于C++的內存泄露,相信大家都不陌生,因為C++的內存分配與釋放是靠程序員自己控制的,C++高手從中獲得了更好的性能,更大的自由,C++菜鳥的收獲則是一遍一遍的檢查代碼和對C++的痛恨。因此要想成為C++高手,內存管理一關是必須要過的,除非放棄C++,轉到Java或者.NET,他們的內存管理基本是自動的,當然你也放棄了自由和對內存的支配權,還放棄了C++超絕的性能。

  如何檢測C++內存泄露,在VS2010中使用時,需加上

#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
  crtdbg.h的作用是將malloc和free函數映射到它們的調試版本_malloc_dbg和_free_dbg,這兩個函數將跟蹤內存分配和釋放(在Debug版本中有效)_CrtDumpMemoryLeaks();函數將顯示當前內存泄露,也就是說程序運行到此行代碼時的內存泄露,所有未銷毀的對象都會報出內存泄露,因此要讓這個函數盡量放到最后。剛剛包含頭文件和加宏定義是重載了malloc函數,并沒有重載new操作符,所以要自己定義重載new操作符才能檢測到泄露內存的申請位置。例如:


#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG //重載new
#define new  new(_NORMAL_BLOCK, __FILE__, __LINE__)  
#endif
#include <iostream>
using namespace std;
int main(int argc,char** argv)
{
	char *str1 = NULL;
	char *str2 = NULL;
	str1=(char*)malloc(100);
	str2=new char[50];

	_CrtDumpMemoryLeaks();
	return 0;
}
運行結果:
Detected memory leaks!
Dumping objects ->
e:\c++\test\內存泄露檢測2\main.cpp(13) : {62} normal block at 0x001714F8, 50 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
e:\c++\test\內存泄露檢測2\main.cpp(12) : {61} normal block at 0x00171458, 100 bytes long.
 Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD 
Object dump complete.


  如果你是調用其他文件的函數,而內存泄露是在其中的函數中出現,這是不會檢測到泄露內存的申請位置,需要在有問題的文件里加上


#define _CRTDBG_MAP_ALLOC
#include <crtdbg.h>
#ifdef _DEBUG //重載new  
#define new  new(_NORMAL_BLOCK, __FILE__, __LINE__)    
#endif 
 如果你的文件出現#include <afxwin.h>,上面的代碼添加到包含該頭文件上面,會報一系列錯誤,這是因為new宏也在afxwin.h中定義了,導致出現沖突,所以最好是將這段代碼放在所有包含頭文件的下面,避免剛才的錯誤。


  關于內存泄露檢測的更多信息,參考http://blog.csdn.net/kangroger/article/details/39317503


標注
評論
站內搜
百度搜
傳送到手機
手機掃碼,識別文字,完成傳送x
加載中...
標注內容x
加載中...
添加標注x
收藏 0 點贊 0

相關閱讀

超级大乐透直播开奖 微信股票分析群 股票手续费计算公式 浙江20选5开奖时间 百宝彩泳坛夺金 浙江11选5下载 哪个网站可以青海11选5 好股票推荐 山西快乐十分官网 买股票怎么开户 中国人寿股票行情