mmem_impl.cpp

来自「跨平台C++基础库」· C++ 代码 · 共 112 行

CPP
112
字号

#include "MCRT/mtypes.h"
#include "MCRT/mmem_impl.h"
#include "mmem_list.h"

#include "ace/Synch.h"

#include <stdlib.h>
#include <string.h>

#ifdef M_MEM_TEST

MemTrace            s_memTrace;
ACE_Thread_Mutex    s_mutexList;

void* operator new( size_t nSize )
{
    void*   pBlock  =   ::malloc( nSize );

    return pBlock;
}

void* operator new[]( size_t nSize )
{
    void*   pBlock  =   ::malloc( nSize );

    return pBlock;
}

void* operator new( size_t nSize, const char* pFileName, mInt32 nLine )
{
    void*   pBlock  =   NULL;
    pBlock  =   ::malloc( nSize );

    if ( pBlock != NULL )
    {
        MemTraceNode*   pNode   =   (MemTraceNode*)::malloc( sizeof(MemTraceNode) );
        if ( pNode != NULL )
        {
            pNode->m_pBlock =   pBlock;
            pNode->m_nSize  =   nSize;
            ::strcpy( pNode->m_szFileName, pFileName );
            pNode->m_nLine  =   nLine;
            pNode->pNext    =   NULL;

            ACE_Guard< ACE_Thread_Mutex >   guard(s_mutexList);
            s_memTrace.insert( pNode );
        }
    }

    return pBlock;
}

void* operator new[]( size_t nSize, const char* pFileName, mInt32 nLine )
{
    void*   pBlock  =   NULL;
    pBlock  =   ::malloc( nSize );

    if ( pBlock != NULL )
    {
        MemTraceNode*   pNode   =   (MemTraceNode*)::malloc( sizeof(MemTraceNode) );
        if ( pNode != NULL )
        {
            pNode->m_pBlock =   pBlock;
            pNode->m_nSize  =   nSize;
            ::strcpy( pNode->m_szFileName, pFileName );
            pNode->m_nLine  =   nLine;
            pNode->pNext    =   NULL;

            ACE_Guard< ACE_Thread_Mutex >   guard(s_mutexList);
            s_memTrace.insert( pNode );
        }
    }

    return pBlock;
}

void operator delete( void* pBlock )
{
    if ( pBlock != NULL )
    {
        ACE_Guard< ACE_Thread_Mutex >   guard(s_mutexList);
        s_memTrace.erase( pBlock );

        ::free( pBlock );
    }
}

void operator delete[]( void* pBlock )
{
    if ( pBlock != NULL )
    {
        ACE_Guard< ACE_Thread_Mutex >   guard(s_mutexList);
        s_memTrace.erase( pBlock );

        ::free( pBlock );
    }
}

//avoid warning of compile
void operator delete( void* /* pBlock */, const char* /* pFileName */, mInt32 /* nLine */ )
{
}

//avoid warning of compile
void operator delete[]( void* /* pBlock */, const char* /* pFileName */, mInt32 /* nLine */ )
{
}

#endif //end M_MEM_TEST

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?