原创 内存泄露(转贴)

2011-7-31 11:59 1022 8 8 分类: 工程师职场
刚刚网上查到资料惠普面试时候问到这个题目,觉得内存泄露问题挺重要的,就看了点这方面的资料在这里显摆了。只为了懂点就可以,所以没有深入研究。

       首先,检测内存泄漏的基本工具是调试器和CRT 调试堆函数。为了使用调试堆函数,必须在要检测内存泄漏和调试的程序中添加下面的语句:
#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>
       其次,一旦添加了上面的声明,你就可以通过在程序中加入下面的代码来报告内存泄漏信息:
_CrtDumpMemoryLeaks();

       我用了C++经典面试题中的典型内存泄露题测试了一下。
#include "stdio.h"
#include <malloc.h>
#include <string.h>
//#define _CRTDBG_MAP_ALLOC
#include<stdlib.h>
#include<crtdbg.h>
void GetMemory2(char **p, int num)
{
*p = (char *)malloc(num);
}
void main(void)
{
char *str = NULL;
GetMemory2(&str, 100);
strcpy(str, "hello");
printf(str);
_CrtDumpMemoryLeaks();
}

在 VC++ 调试会话(按 F5 调试运行)Output 窗口的Debug页便看到了预期的内存泄漏dump。该dump形式如下:
etected memory leaks!
Dumping objects ->
J:\C++STUDY\memoryleak\memoryleak.cpp(11) : {42} normal block at 0x00430080, 100 bytes long.
Data: <hello           > 68 65 6C 6C 6F 00 CD CD CD CD CD CD CD CD CD CD
Object dump complete.
The thread 0xA7C has exited with code 1 (0x1).
The program 'J:\C++STUDY\memoryleak\Debug\memoryleak.exe' has exited with code 1 (0x1).

如果不加#define _CRTDBG_MAP_ALLOC这条语句,内存泄漏的输出如下:
Detected memory leaks!
Dumping objects ->
{42} normal block at 0x00430080, 100 bytes long.
Data: <hello           > 68 65 6C 6C 6F 00 CD CD CD CD CD CD CD CD CD CD
Object dump complete.
The thread 0x3DC has exited with code 1 (0x1).
The program 'J:\C++STUDY\memoryleak\Debug\memoryleak.exe' has exited with code 1 (0x1).
根据这段输出信息,你无法知道在哪个源程序文件里发生了内存泄漏。

{xx}:花括弧内的数字是内存分配序号,本文例子中是 {42};
block:内存块的类型,常用的有三种:normal(普通)、client(客户端)或 CRT(运行时);本文例子中是:normal block;
用十六进制格式表示的内存位置,如:at 0x00441BA0 等;
以字节为单位表示的内存块的大小,如:32 bytes long;
前 16 字节的内容(也是用十六进制格式表示),如:Data: <AB> 41 42 等

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
8
关闭 站长推荐上一条 /5 下一条