由MALLOC分配的内存,如果退出程序时没有释放,会在output窗口heap info信息里显示这块内存是在哪个文件,哪一行分配的。
BREW的MALLOC是这样定义的
#define MALLOC(size) GET_HELPER()->dbgheapmark(GET_HELPER()->malloc((size)),__FILE__,__LINE__)
这里调用了两个函数,一个是真正的内存分配函数GET_HELPER()->malloc,它返回的内存地址是第二个函数GET_HELPER()-
>dbgheapmark的第一个参数。dbgheapmark的后两个参数,使用的是预编译宏__FILE__,__LINE__,得到MALLOC宏展开后所在的文件和行
号。dbgheapmark函数的功能,就是给每个已分配出去的内存块加上这些标记,使程序员可以轻松得到堆中各个内存块的程序含义。
在BREW中使用c++语言,要重载new操作符:
void* operator new(size_t size)
{
void* memptr = 0;
memptr = MALLOC(size);
return memptr;
}
这里只是调用了BREW的MALLOC函数。一个副作用就是,由new分配的内存块,标记的信息是
memptr=MALLOC(size)
这一行所在的文件名和行号。内存块的程序含义丢失了。
可以改写new操作符重载函数,消除这个副作用:
void* operator new(size_t size,char* filename,int line_num)
{
void* memptr = 0;
memptr = MALLOC(size);
MEMSET(memptr, 0, size);
DBGHEAPMARKEX(memptr,filename,line_num);
return memptr;
}
#define NEW new(__FILE__,__LINE__)
用定义的NEW宏,而不是new关键字建立动态对象,就可以保留内存块的程序含义了。