游戏开发论坛

 找回密码
 立即注册
搜索
查看: 4889|回复: 7

小技巧:如何在非mfc程序中检测内存泄漏?

[复制链接]

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
发表于 2005-4-17 06:45:00 | 显示全部楼层 |阅读模式
在mfc中每一个mfc类都类似于带有下面的代码,帮助我们检测时候有内存泄漏的情况:
#ifdef _DEBUG
virtual void AssertValid() const;
virtual void Dump(CDumpContext& dc) const;
#endif



如果发生了内存泄漏,Visual Studio 输出窗口会打印出关于内存泄漏情况的信息。



那么如果不使用 mfc 怎么检测是否发生了内存泄漏呢?
还好微软给我们提供了一个调试苦,只要引用这个库,然后在程序终止之前加上一些代码就可以了。具体步骤如下:
1. 在 StdAfx.h 头文件中引用 #include <crtdbg.h>
2. 在程序终止代码上加上下面的代码:
#ifdef _DEBUG
_CrtDumpMemoryLeaks();
#endif



这一次当程序发生了内存泄漏以后,即使不是 mfc 程序 Visual Studio 也会在输出窗口会打印出关于内存泄漏情况的信息了。



不过上面的程序有些问题,可能会造成误判。比如象下面的程序的内存泄漏实际上就是个假象。因为在main退出之前,mm还没有被释放掉。






#define WIN32_LEAN_AND_MEAN



#include <stdio.h>
#include <tchar.h>
#include <crtdbg.h>
#include <map>



int _tmain(int argc, _TCHAR* argv[])
{



typedef std::map<int, int> INT_MAP;
INT_MAP mm;



#ifdef _DEBUG
_CrtDumpMemoryLeaks();
#endif



return 0;
}



and the output window told us:



Detected memory leaks!
Dumping objects ->
{56} normal block at 0x00373C90, 24 bytes long.
Data: < <7  <7  <7     > 90 3C 37 00 90 3C 37 00 90 3C 37 00 CD CD CD CD
Object dump complete.



那么有没有更好的方法呢,答案是有的,看看下面的程序就能解决在main退出后和静态变量都被释放后,是否还有内存被泄漏的报警问题。



#define WIN32_LEAN_AND_MEAN



#include <stdio.h>
#include <tchar.h>
#include <crtdbg.h>
#include <map>



int _tmain(int argc, _TCHAR* argv[])
{
  _CrtSetDbgFlag(_CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)
      | _CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF
      | _CRTDBG_DELAY_FREE_MEM_DF);



typedef std::map<int, int> INT_MAP;
INT_MAP mm;



return 0;
}


希望能对大家有所帮助。

24

主题

229

帖子

229

积分

中级会员

Rank: 3Rank: 3

积分
229
发表于 2005-4-17 11:34:00 | 显示全部楼层

Re:小技巧:如何在非mfc程序中检测内存泄漏?

支持!
第二个例子的函数好恐怖,能不能大概说下,多谢!:)

30

主题

276

帖子

276

积分

中级会员

Rank: 3Rank: 3

积分
276
发表于 2005-4-17 13:51:00 | 显示全部楼层

Re:小技巧:如何在非mfc程序中检测内存泄漏?

MFC记录泄露行号的方法.
具体实现象下面这样..
void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine);
#define DEBUG_NEW new(THIS_FILE, __LINE__)
#if _MSC_VER >= 1200
void AFX_CDECL operator delete(void* p, LPCSTR lpszFileName, int nLine);
#endif
详见afx.h.
虽然说MFC这样重载全局new不好,可是由于现在新的库设计时都基本回避了全局new,所以其实这样用也不会有大的问题.

248

主题

2674

帖子

2702

积分

金牌会员

Rank: 6Rank: 6

积分
2702
QQ
发表于 2005-4-17 16:28:00 | 显示全部楼层

Re:小技巧:如何在非mfc程序中检测内存泄漏?


不是不用mfc做游戏么?

17

主题

454

帖子

470

积分

中级会员

Rank: 3Rank: 3

积分
470
发表于 2005-4-17 20:32:00 | 显示全部楼层

Re:小技巧:如何在非mfc程序中检测内存泄漏?

通用的内存管理器意义不是很大.
用BounderCheck 能搞定基本上的内存leak问题.

139

主题

2005

帖子

2057

积分

金牌会员

Rank: 6Rank: 6

积分
2057
QQ
 楼主| 发表于 2005-4-17 20:43:00 | 显示全部楼层

Re:小技巧:如何在非mfc程序中检测内存泄漏?

同意楼上的说。我的profile也只是在debug的时候起效果~哎~

28

主题

685

帖子

703

积分

高级会员

Rank: 4

积分
703
发表于 2005-4-17 23:11:00 | 显示全部楼层

很可惜,现在的代码基本上是C++的,得自己重载new,不然

rt

69

主题

450

帖子

473

积分

中级会员

战魂缔造者

Rank: 3Rank: 3

积分
473
QQ
发表于 2005-4-18 10:01:00 | 显示全部楼层

Re:小技巧:如何在非mfc程序中检测内存泄漏?

好文, 顶上
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-12-25 08:35

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表