DWORD size; char file[64]; DWORD line; } ALLOC_INFO;
typedef list<ALLOC_INFO*> AllocList;
AllocList *allocList;
void AddTrack(DWORD addr, DWORD asize, const char *fname, DWORD lnum) { ALLOC_INFO *info;
if(!allocList) { allocList = new(AllocList); }
info = new(ALLOC_INFO); info->address = addr; strncpy(info->file, fname, 63); info->line = lnum; info->size = asize; allocList->insert(allocList->begin(), info); };
void RemoveTrack(DWORD addr) www phperz com { AllocList::iterator i;
if(!allocList) return; for(i = allocList->begin(); i != allocList->end(); i++) { if((*i)->address == addr) { allocList->remove((*i)); break; } } }; 现在,在我们的程序退出之前,allocList存储了没有被释放的内存分配。为了看到它们是什么和在哪里被分配的,我们需要打印出allocList中的数据。我使用了Visual C++中的Output窗口来做这件事情。 void DumpUnfreed() { AllocList::iterator i; DWORD totalSize = 0; char buf[1024];
if(!allocList) return;
for(i = allocList->begin(); i != allocList->end(); i++) { sprintf(buf, "%-50s: LINE %d, ADDRESS %d %d unfreed ", PHP程序员站 (*i)->file, (*i)->line, (*i)->address, (*i)->size); OutputDebugString(buf); totalSize += (*i)->size; } sprintf(buf, "----------------------------------------------------------- "); OutputDebugString(buf); sprintf(buf, "Total Unfreed: %d bytes ", totalSize); OutputDebugString(buf); }; 现在我们就有了一个可以重用的代码,用来监测跟踪所有的内存泄漏了。这段代码可以用来加入到所有的项目中去。虽然它不会让你的程序看起来更好,但是起码它能够帮助你检查错误,让程序更加的稳定。 PHP程序员站--PHP程序员之家
|