关闭

简易 查找VS2008控制台内存泄露

标签: c++
935人阅读 评论(0) 收藏 举报
分类:
     由于在学习C++,其中经常一个问题就是内存管理问题。
1.内存泄露问题
     就是通过动态分配的内存,但是在程序结束的时候,并没有释放掉,而导致的问题。这个问题特别出现在连续24小时工作的平台上,一般有这样的问题,时间一久就内存不断减少,直至系统崩溃。
2.在MFC程序中,已经有了内存检查机制。如何在控台程序中也出现呢?
     希望的就是,在程序退出之前检查是否有内存泄露,也就是动态申请的内存有没有释放掉。一旦有的话,就直接弹出一个对话框,提示。而且可以定位到具体哪行可能出现的泄露问题。
     将具体的信息做成一个头文件,然后放置到在每个工程中,再在程序中Include该头文件。在main函数注册一下。atexit(Exit)一下。具体的见下图。

3.步骤
①添加测试文件


如上是我建立的一个控制台工程,将TestMemoryLeak.h加入到该工程中。该文件的代码为:

#include <assert.h>
#ifdef _DEBUG
#define DEBUG_NORMALBLOCK    new( _NORMAL_BLOCK, __FILE__, __LINE__)
#else
#define DEBUG_NORMALBLOCK
#endif
#define _CRTDBG_MAP_ALLOC //添加内存映射信息 可以看出在哪个文件哪行 内存泄露
#include <crtdbg.h>
#ifdef _DEBUG
#define new DEBUG_NORMALBLOCK
#endif

void Exit()
{
	int i = _CrtDumpMemoryLeaks(); //一旦有内存泄露返回 非0
	assert( i == 0); //assert后面是个布尔值 为真 继续运行。为假卡住
}


② 在控制台程序中 include进去,然后在Mian函数注册一下.h文件中的有的函数 Exit.


③点击调试 F5不是 Ctrl +F5.


发现了debug error.这是因为assert导致的。

④ 如何定位具体的哪个行代码呢?

在点击终止后,查看输出窗口。


看到了信息。双击输出的源文件那行。自动定位到 内存泄露的地方。


具体头文件中什么意思。Exit函数什么意思。可以自行查找。这个只是简单的在控制台使用,因为只有一个出口,对于多出口的就不好使了。具体很多调试技术,网上也有很多。

特别要注意的是:你控制台程序的输入输出不要使用iostream.使用stdio.h。不然编译不通过。


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:61930次
    • 积分:1112
    • 等级:
    • 排名:千里之外
    • 原创:50篇
    • 转载:2篇
    • 译文:0篇
    • 评论:16条
    最新评论