メモリリークc++new delete
3536 ワード
#include
#include
struct MemIns
{
void *pMem;
int m_nSize;
char m_szFileName[256];
int m_nLine;
MemIns *pNext;
};
class MemManager
{
public:
MemManager();
~MemManager();
private:
MemIns *m_pMemInsHead;
int m_nTotal;
public:
static MemManager* GetInstance();
void Append(MemIns *pMemIns);
void Remove(void *ptr);
void Dump();
};
void *operator new(size_t size, const char*szFile, int nLine);
void operator delete(void*ptr, const char*szFile, int nLine);
void operator delete(void*ptr);
void *operator new[] (size_t size, const char*szFile, int nLine);
void operator delete[](void*ptr, const char*szFile, int nLine);
void operator delete[](void *ptr);
#include"memchecker.h"
#include
#include
#include
MemManager::MemManager()
{
m_pMemInsHead=NULL;
m_nTotal=NULL;
}
MemManager::~MemManager()
{
}
void MemManager::Append(MemIns *pMemIns)
{
pMemIns->pNext=m_pMemInsHead;
m_pMemInsHead = pMemIns;
m_nTotal+= m_pMemInsHead->m_nSize;
}
void MemManager::Remove(void *ptr)
{
MemIns * pCur = m_pMemInsHead;
MemIns * pPrev = NULL;
while(pCur)
{
if(pCur->pMem ==ptr)
{
if(pPrev)
{
pPrev->pNext =pCur->pNext;
}
else
{
m_pMemInsHead =pCur->pNext;
}
m_nTotal-=pCur->m_nSize;
free(pCur);
break;
}
pPrev = pCur;
pCur = pCur->pNext;
}
}
void MemManager::Dump()
{
MemIns *pp = m_pMemInsHead;
while(pp)
{
printf( "File is %s
", pp->m_szFileName );
printf( "Size is %d
", pp->m_nSize );
printf( "Line is %d
", pp->m_nLine );
pp = pp->pNext;
}
}
void PutEntry(void *ptr,int size,const char*szFile, int nLine)
{
MemIns * p = (MemIns *)(malloc(sizeof(MemIns)));
if(p)
{
strcpy(p->m_szFileName,szFile);
p->m_nLine = nLine;
p->pMem = ptr;
p->m_nSize = size;
MemManager::GetInstance()->Append(p);
}
}
void RemoveEntry(void *ptr)
{
MemManager::GetInstance()->Remove(ptr);
}
void *operator new(size_t size,const char*szFile, int nLine)
{
void *ptr = malloc(size);
PutEntry(ptr,size,szFile,nLine);
return ptr;
}
void operator delete(void *ptr)
{
RemoveEntry(ptr);
free(ptr);
}
void operator delete(void*ptr,const char *file, int line)
{
RemoveEntry(ptr);
free(ptr);
}
void*operator new[] (size_t size,const char* szFile,int nLine)
{
void * ptr = malloc(size);
PutEntry(ptr,size,szFile,nLine);
return ptr;
}
void operator delete[](void *ptr)
{
RemoveEntry(ptr);
free(ptr);
}
void operator delete[](void*ptr,const char*szFile,int nLine)
{
RemoveEntry(ptr);
free(ptr);
}
#define new new(__FILE__,__LINE__)
MemManager m_memTracer;
MemManager*MemManager::GetInstance()
{
return &m_memTracer;
}
int main(void)
{
int *plen =new int ;
*plen=10;
delete plen;
char *pstr=new char[35];
strcpy(pstr,"hello memory leak");
m_memTracer.Dump();
return 0;
}
実行結果
[root@test memcheck]# ./memcheck
File is memchecker.cpp
Size is 35
Line is 148