C++程序内存泄露检测工具
作者:网络转载 发布时间:[ 2014/10/30 11:20:41 ] 推荐标签:c++ 内测 NET 软件开发
2、源文件
#define MAX_FILE_LEN 128
//须要实现的功能
//1 将分配的内存信息写入文件
//2 将释放的内存信息写入文件
//3 将分配的内存信息都保存到内存中,提供一个接口将当前的内存泄露情况报告出去。
//定义一个结构,保存内存分配信息
typedef struct _tagMemoryInfo
{
void* addr; //保存分配的内存地址
size_t size; //内存大小
_UL lineNum; //调用内存分配函数的行号
char fileName[MAX_FILE_LEN]; //文件名
}MemoryInfo;
//内存分配信息的链表结构,这里之所以定义为union类型,是为了省去next成员的开销
union FreeList
{
FreeList* next;
MemoryInfo data;
};
typedef struct _tagBusyList
{
_tagBusyList* next;
MemoryInfo* data;
}BusyList;
//空暇链表的初始长度
#define FREE_LIST_INIT_LEN 16
//空暇链表的头指针
static FreeList* g_freeList = NULL;
//正在使用链表的头指针
static BusyList* g_busyList = NULL;
//内部使用函数的声明
static void _CreateFreeList(int initLen);
static void _ReleaseFreeList();
static void* _GetFreeNode();
static void* _GetBusyNode();
static void _FreeNode(void* p);
static void _WriteMemoryInfo(const MemoryInfo* pInfo , bool bAlloc);
static void _StoreMemoryAllocInfo(void* addr , size_t size , _UL lineNum , const char* file);
static void _StoreMemoryDeallocInfo(void* addr);
void* __cdecl operator new(unsigned int size , _UL lineNum , const char* file)
{
void* p = ::operator new(size);
_StoreMemoryAllocInfo(p , size , lineNum , file);
return p;
//return 0;
}
void __cdecl operator delete(void* p)
{
_StoreMemoryDeallocInfo(p);
}
void __cdecl operator delete(void *p, _UL lineNum , const char* file)
{
lineNum;
file;
_StoreMemoryDeallocInfo(p);
}
void* __cdecl operator new[](unsigned int size , _UL lineNum , const char* file)
{
void* p = ::operator new(size);
_StoreMemoryAllocInfo(p , size , lineNum , file);
return p;
}
void __cdecl operator delete [] (void *p)
{
_StoreMemoryDeallocInfo(p);
}
void __cdecl operator delete [] (void *p , _UL lineNum , const char* file)
{
lineNum;
file;
_StoreMemoryDeallocInfo(p);
}
void* __cdecl _DebugMalloc(size_t size , _UL lineNum , const char* file)
{
void* p = malloc(size);
_StoreMemoryAllocInfo(p , size , lineNum , file);
return p;
}
void* __cdecl _DebugCalloc(size_t num , size_t size , _UL lineNum , const char* file)
{
void* p = calloc(num , size);
_StoreMemoryAllocInfo(p , num * size , lineNum , file);
return p;
}
void __cdecl _DebugFree(void* addr)
{
_StoreMemoryDeallocInfo(addr);
}
//创建一个空暇节点链表,生成一个内存池,用以记录内存分配信息。
//这样当频繁分配内存的时候,不会由于检?工具本身的性能,影响应用程序的性能。
void _CreateFreeList(int initLen)
{
FreeList* p = (FreeList*)malloc(sizeof(FreeList) * initLen);
g_freeList = p;
for (int idx = 1; idx < initLen; ++idx)
{
p->next = p + idx;
p++;
}
p->next = NULL;
}
void* _GetFreeNode()
{
if ( g_freeList == NULL)
{
_CreateFreeList(FREE_LIST_INIT_LEN);
if ( NULL == g_freeList )
{
return NULL;
}
}
FreeList* p = g_freeList;
g_freeList = g_freeList->next;
return (void*)p;
}
本文内容不用于商业目的,如涉及知识产权问题,请权利人联系SPASVO小编(021-61079698-8054),我们将立即处理,马上删除。
相关推荐

更新发布
功能测试和接口测试的区别
2023/3/23 14:23:39如何写好测试用例文档
2023/3/22 16:17:39常用的选择回归测试的方式有哪些?
2022/6/14 16:14:27测试流程中需要重点把关几个过程?
2021/10/18 15:37:44性能测试的七种方法
2021/9/17 15:19:29全链路压测优化思路
2021/9/14 15:42:25性能测试流程浅谈
2021/5/28 17:25:47常见的APP性能测试指标
2021/5/8 17:01:11热门文章
常见的移动App Bug??崩溃的测试用例设计如何用Jmeter做压力测试QC使用说明APP压力测试入门教程移动app测试中的主要问题jenkins+testng+ant+webdriver持续集成测试使用JMeter进行HTTP负载测试Selenium 2.0 WebDriver 使用指南