📄 mmem_list.cpp
字号:
#ifdef M_MEM_TEST
#include "mmem_list.h"
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
MemTrace::MemTrace()
{
m_listHead.m_pBlock = NULL;
m_listHead.m_nSize = 0;
//strcpy( m_listHead.m_szFileName, *, * );
m_listHead.m_nLine = 0;
m_listHead.pNext = NULL;
}
MemTrace::~MemTrace()
{
this->displayMemLeaked();
if ( this->m_listHead.pNext != NULL ) //list is not empty
{
MemTraceNode* pNode = this->m_listHead.pNext;
while ( pNode != NULL )
{
this->m_listHead.pNext = pNode->pNext;
//release leaked memory
::free( pNode->m_pBlock );
//release node
::free( pNode );
pNode = this->m_listHead.pNext;
}
}
}
void MemTrace::insert( MemTraceNode* pNode )
{
if ( pNode != NULL )
{
//find last node
MemTraceNode* pTailNode = &(this->m_listHead);
while( pTailNode->pNext != NULL )
{
pTailNode = pTailNode->pNext;
}
pTailNode->pNext = pNode;
pNode->pNext = NULL;
}
}
void MemTrace::erase( void* pBlock )
{
if ( pBlock != NULL )
{
//find the block node
MemTraceNode* pPrevNode = &(this->m_listHead);
MemTraceNode* pNode = pPrevNode->pNext;
while ( pNode != NULL )
{
if ( pNode->m_pBlock == pBlock )
{
break;
}
pPrevNode = pNode;
pNode = pPrevNode->pNext;
}
//if block node is found
if ( pNode != NULL )
{
pPrevNode->pNext = pNode->pNext;
//release leaked memory
//::free( pNode->m_pBlock );
//release node
::free( pNode );
}
}
}
void MemTrace::displayMemLeaked()
{
MemTraceNode* pNode = this->m_listHead.pNext;
printf( "\n\nMemory Block leaked ...\n" );
while ( pNode != NULL )
{
printf( " %s(%d) : normal block at 0x%x, %d bytes long.\n",
pNode->m_szFileName,
pNode->m_nLine,
pNode->m_pBlock,
pNode->m_nSize
);
pNode = pNode->pNext;
}
printf( "\n" );
}
#endif //end M_MEM_TEST
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -