设为首页 加入收藏

TOP

C++检查内存泄露(一)
2015-11-21 01:11:14 来源: 作者: 【 】 浏览:4
Tags:检查 内存 泄露
说明,我使用的ide是vs2008
?
?
1. 工程设置为debug
内存泄露的检测一般在debug模式下进行
?
2.在需要检查内存泄露的cpp头部加上
[cpp]?
#ifdef ?_DEBUG ?
?#define _CRTDBG_MAP_ALLOC ?
?#include ?
?#include ?
? ? #define new ? new(_NORMAL_BLOCK, __FILE__, __LINE__) ?
?#endif ?
?
3.代码中插入这么一句话
EnableMemLeakCheck();
[cpp]?
inline void EnableMemLeakCheck() ?
?{ ?
? ? _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG) | _CRTDBG_LEAK_CHECK_DF); ?
?} ?
? ?
?
4.然后就可以在输出中看泄露情况了
举个例子,例子中我用newEx表示的上述宏定义中的new
[cpp] ?
int _tmain(int argc, _TCHAR* argv[]) ?
?{ ?
? ? EnableMemLeakCheck(); ?
? ? int num = 10; ?
? ? byte **p = newEx byte *[num]; ?
? ? for (int i = 0; i < num; i ++) ?
? ? { ?
? ? ? ? Sleep(1); ?
? ? ? ? *p = newEx byte[i]; ?
? ? } ?
? ?
? ? long *pl = newEx long[100]; ?
? ?
? ? while(1) ?
? ? { ?
? ? ? ? Sleep(100); ?
? ? } ?
? ? return 0; ?
?} ?
?
输出中显示的内容(debug下运行程序,然后点叉叉关闭程序)
memory leaks!
?Dumping objects ->
?e:\project\test\test_mem_leak\test_mem_leak\test_mem_leak.cpp(101) : {124} normal block at 0x00295CB8, 400 bytes long.
? Data: < ? ? ? ? ? ? ? ?> CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD?
?e:\project\test\test_mem_leak\test_mem_leak\test_mem_leak.cpp(92) : {122} normal block at 0x00294C30, 9 bytes long.
? Data: < ? ? ? ? > CD CD CD CD CD CD CD CD CD?
?e:\project\test\test_mem_leak\test_mem_leak\test_mem_leak.cpp(92) : {121} normal block at 0x00294BE8, 8 bytes long.
? Data: < ? ? ? ?> CD CD CD CD CD CD CD CD?
?e:\project\test\test_mem_leak\test_mem_leak\test_mem_leak.cpp(92) : {120} normal block at 0x00299F88, 7 bytes long.
? Data: < ? ? ? > CD CD CD CD CD CD CD?
?e:\project\test\test_mem_leak\test_mem_leak\test_mem_leak.cpp(92) : {119} normal block at 0x00299F40, 6 bytes long.
? Data: < ? ? ?> CD CD CD CD CD CD?
?e:\project\test\test_mem_leak\test_mem_leak\test_mem_leak.cpp(92) : {118} normal block at 0x00299EF8, 5 bytes long.
? Data: < ? ? > CD CD CD CD CD?
?e:\project\test\test_mem_leak\test_mem_leak\test_mem_leak.cpp(92) : {117} normal block at 0x00299EB8, 4 bytes long.
? Data: < ? ?> CD CD CD CD?
?e:\project\test\test_mem_leak\test_mem_leak\test_mem_leak.cpp(92) : {116} normal block at 0x00299E78, 3 bytes long.
? Data: < ? > CD CD CD?
?e:\project\test\test_mem_leak\test_mem_leak\test_mem_leak.cpp(92) : {115} normal block at 0x00299E38, 2 bytes long.
? Data: < ?> CD CD?
?e:\project\test\test_mem_leak\test_mem_leak\test_mem_leak.cpp(92) : {114} normal block at 0x00299DF8, 1 bytes long.
? Data: < > CD?
?e:\project\test\test_mem_leak\test_mem_leak\test_mem_leak.cpp(92) : {113} normal block at 0x00299DB8, 0 bytes long.
? Data: <> 励p
?e:\project\test\test_mem_leak\test_mem_leak\test_mem_leak.cpp(88) : {112} normal block at 0x00299D50, 40 bytes long.
? Data: <0L) ? ? ? ? ? ? > 30 4C 29 00 CD CD CD CD CD CD CD CD CD CD CD CD?
?Object dump complete.
?
有文件名和行号,先申请的后释放。
?
扩展:
实际上是使用了另外的new,在dbgnew.cpp中,列一个例子说明:
?
[cpp] ?
void *__CRTDECL operator new[]( ?
? ? ? ? ?size_t cb, ?
? ? ? ? ?int nBlockUse, ?
? ? ? ? ?const char * szFileName, ?
? ? ? ? ?int nLine ?
? ? ? ? ?) ?
? ? ? ? ?_THROW1(_STD bad_alloc) ?
?{ ?
? ? ?void *res = operator new(cb, nBlockUse, szFileName, nLine ); ?
? ?
? ? ?RTCCALLBACK(_RTC_Allocate_hook, (res, cb, 0)); ?
? ?
? ? ?return res; ?
?} ?
? ?
?
注意,const char *szFileName可以使用__file__也可以使用自定义的类,经过重载为char*(感谢老马提供代码)
例如:
[cpp] ?
char new_index_recorder_file_name[1024 * 1024][2
首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇杭电OJ――1210 Eddy's 洗牌.. 下一篇A Bug's Life hdu1829 并查集

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: