自带内存分配器的内存检测方法
2016-05-26 15:33
316 查看
在实际项目开发中,内存泄露问题是一个很头疼的问题,程序跑着跑着就挂了会造成巨大的损失,所以必须知道整个程序在运行过程中哪些地方内存泄露了,泄露了多少。
一般的大型项目都会有一套属于自己的内存分配机制,这样能更加容易的进行内存管理和内存跟踪,及时发现内存泄露。
记住 #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了多少的内存,你可以记录下来,当程序结束的时候,统计没有被释放的内存块,然后打印它们的位置信息,这样就可以很快的定位到哪里出现了内存泄露。
一般的大型项目都会有一套属于自己的内存分配机制,这样能更加容易的进行内存管理和内存跟踪,及时发现内存泄露。
#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了多少的内存,你可以记录下来,当程序结束的时候,统计没有被释放的内存块,然后打印它们的位置信息,这样就可以很快的定位到哪里出现了内存泄露。
相关文章推荐
- 安装2:cannot save the license information because access to the registry is denied......
- MFC基于对话框的的多点触控简单画图程序
- RMQ问题分析
- c++二叉树
- 从句的判别
- nginx的root和alias指令的区别
- 忆仙剑
- Play Framework, Server Sent Events and Internet Explorer
- Android Runnable运行在哪个线程
- CQU 雷神之路(DP+矩阵加速)
- Swift\本地文件管理
- CodeForces651BBeautiful Paintings
- UGUI里面button的移动
- 移动支付后台JAVA实现备注
- pnp4nagios在icinga2上安装注意事项
- 在CentOS环境下安装g++详细流程<有图>
- Android实现基于TCP和UDP协议的即时通讯,含android端和服务器端
- Django push: Using Server-Sent Events and WebSocket with Django
- Linux下用C语言实现守护进程
- iOS开发之SQLite--C语言接口规范(三)——Binding Values To Prepared Statements