vc程序在调试模式下,new分配的内存通过一个结构体CrtMemBlockHeader来形成双链表
typedef struct CrtMemBlockHeader{
struct CrtMemBlockHeader *pBlockHeaderNext; // Pointer to the block allocated just before this one:
struct CrtMemBlockHeader *pBlockHeaderPrev; // Pointer to the block allocated just after this one:
char *szFileName; // File name
int nLine; // Line number
size_t nDataSize; // Size of user block
int nBlockUse; // Type of block
long lRequest; // Allocation number
unsigned char gap[4]; // nNoMansLandSize // Buffer just before (lower than) the user's memory:
} CrtMemBlockHeader;
因而可以写一个在程序退出的时候输出没有释放的内存,即遍历该双链表,将代码行和文件名称打印出来
int* p = new int;
CrtMemBlockHeader* phead = (CrtMemBlockHeader*)p;
phead--;
if(phead && phead->pBlockHeaderNext){
phead = phead->pBlockHeaderNext;
while (phead)
{
void* ptr = (void*)(phead+1);
if(phead->nLine!=0)
{
DBGVIEW("dataSize:%6d line:%4d File:%s",
phead->nDataSize,phead->nLine,phead->szFileName);
}
phead = phead->pBlockHeaderNext;
}
break;
}else{
DBGVIEW("invalid header_ %x",phead);
}
delete p;