您的位置:首页 > 其它

自带内存分配器的内存检测方法

2016-05-26 15:33 316 查看
在实际项目开发中,内存泄露问题是一个很头疼的问题,程序跑着跑着就挂了会造成巨大的损失,所以必须知道整个程序在运行过程中哪些地方内存泄露了,泄露了多少。

一般的大型项目都会有一套属于自己的内存分配机制,这样能更加容易的进行内存管理和内存跟踪,及时发现内存泄露。

#include "iostream"
#include <windows.h>
#include "winbase.h"
using namespace std;

void* MyAlloc(size_t size, const char* filename, int line)
{
// 分配内存

// 输出信息,此为简单例子,实际开发中会讲内存分配信息保存,程序结束时输出内存泄露的相关文件位置和信息
char str[100];
sprintf_s(str, "%s(%d) : alloc size=%dbytes", filename, line, size);

WCHAR wszClassName[256];
memset(wszClassName, 0, sizeof(wszClassName));
MultiByteToWideChar(CP_ACP, 0, str, strlen(str) + 1, wszClassName,
sizeof(wszClassName) / sizeof(wszClassName[0]));

OutputDebugString(wszClassName);

return NULL;
}

void* operator new(size_t size)
{
return MyAlloc(size, __FILE__, __LINE__);
}

void* operator new(size_t size, const char* filename, int line)
{
return MyAlloc(size, filename, line);
}

// 顺序很重要啊!!!!
#ifdef _DEBUG
#undef DEBUG_NEW
#undef new
#define DEBUG_NEW new(__FILE__,__LINE__)
#define new DEBUG_NEW
#endif

class A
{
public:
int a;
};

int _tmain(int argc, _TCHAR* argv[])
{
A* a = new A;
return 0;
}


记住 #define new DEBUG_NEW 其实是定义一个名为new的宏,而且这条宏定义必须在new函数实现之后,因为如果在之前定义的话,接下的代码出现new的地方就会是一个宏定义new,所以new函数重载地方会报错。在debug环境下,new A讲执行void* operator new(size_t size, const char* filename, int line)函数,其中带了额外的两个参数__FILE__,__LINE__,分别为new A这条语句的当前文件位置和行位置。这样,你就可以知道在什么地方new了一个A对象,new了多少的内存,你可以记录下来,当程序结束的时候,统计没有被释放的内存块,然后打印它们的位置信息,这样就可以很快的定位到哪里出现了内存泄露。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: