由于在学习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。不然编译不通过。
简易 查找VS2008控制台内存泄露
最新推荐文章于 2020-03-23 16:07:35 发布