//+---------------------------------------------------------------------------- // // File: mem.h // // Module: common // // Synopsis: Defined memory allocation routines: new delete SaAlloc SaFree and SaRealloc // // In retail version, HeapAlloc and HeapFree will be called // // In debug version, all allocated memory blocks are tracked and guarded with // special flag to watch for memory overwritten and memory leak. The memory // leak is reported when the binary is unloaded. The file name and line number // are also recorded and will be reported. // // You need to link with utils.lib and debug.lib // If you are using ATL, make sure to include mem.h and debug.h before // atlbase.h in stdafx.h // If you are using STL. undef _ATL_NO_DEBUG_CRT before include debug.h and // mem.h to allow crtdbg.h. However fileName/lineNumber for new will not // be recorded. // // Copyright (C) 1997-1998 Microsoft Corporation. All rights reserved. // // Author: fengsun // // Created 9/24 98 // //+---------------------------------------------------------------------------- #ifndef _MEM_INC_ #define _MEM_INC_ #include #if (defined(_DEBUG) || defined(DEBUG) ) #define DEBUG_MEM // Enabled DEBUG_MEM in debug version #endif // _DEBUG || DEBUG // // If DEBUG_MEM is defined, keep track of all the allocations // Otherwise, only keep the count for memory leak // #if defined(DEBUG_MEM) // // Track all the allocated blocks with file name and line number // void* AllocDebugMem(long nSize, const char* lpFileName,int nLine); BOOL FreeDebugMem(void* lpMem); void* ReAllocDebugMem(void* lpMem, long nSize, const char* lpFileName,int nLine); BOOL CheckDebugMem(); #define SaAlloc(nSize) AllocDebugMem(nSize,__FILE__, __LINE__) #define SaFree(lpMem) ((void)FreeDebugMem(lpMem)) #define SaRealloc(pvPtr, nSize) ReAllocDebugMem(pvPtr, nSize,__FILE__, __LINE__) inline void __cdecl operator delete(void* p) {SaFree(p);} inline void* __cdecl operator new(size_t nSize, const char* lpszFileName, int nLine) { return AllocDebugMem(nSize, lpszFileName, nLine); } inline void* __cdecl operator new(size_t nSize) { return AllocDebugMem(nSize, NULL, 0); } #ifdef _ATL_NO_DEBUG_CRT // new and delete is also defined by crtdbg.h // // Redefine new to keep track of the file name and line number // #define DEBUG_NEW new(__FILE__, __LINE__) #define new DEBUG_NEW #endif // _ATL_NO_DEBUG_CRT #else // DEBUG_MEM #define CheckDebugMem() (TRUE) // // if _ATL_MIN_CRT is defined, ATL will implement these new/delete and CRT functions // #ifdef _ATL_MIN_CRT #include inline void *SaRealloc(void *pvPtr, size_t nBytes) {return realloc(pvPtr, nBytes);}; inline void *SaAlloc(size_t nBytes) {return malloc(nBytes);}; inline void SaFree(void *pvPtr) {free(pvPtr);}; // // be consist with debug version. atlimpl.cpp will zero out upon allocation // #define _MALLOC_ZEROINIT #else // _ATL_MIN_CRT // // Use our own implementation // void *SaRealloc(void *pvPtr, size_t nBytes); void *SaAlloc(size_t nBytes); void SaFree(void *pvPtr); #ifndef NO_INLINE_NEW // sometime, these functions are not inlined and cause link problem, not sure why inline void __cdecl operator delete(void* p) {SaFree(p);} inline void* __cdecl operator new( size_t cSize ) { return SaAlloc(cSize); } #endif // NO_INLINE_NEW #endif // _ATL_MIN_CRT #endif // DEBUG_MEM #endif _MEM_INC_