//////////////////////////////////////////////////////////////////////////////// // // Filename : MemoryManagement.h // Purpose : To collect all memory management issues. // // Project : Persistent Query // Component: Common // // Author : urib // // Log: // Apr 13 2000 urib Creation // //////////////////////////////////////////////////////////////////////////////// #ifndef MEMORYMANAGEMENT_H #define MEMORYMANAGEMENT_H #include "Excption.h" #include "Excption.h" #if !(defined(_PQS_LEAK_DETECTION) && defined(_DEBUG)) //////////////////////////////////////////////////////////////////////////////// // // Debug OFF // Debug OFF // Debug OFF // //////////////////////////////////////////////////////////////////////////////// inline void* __cdecl operator new(size_t s) throw (CMemoryException) { void *p = malloc(s); if (NULL == p) { throw CMemoryException(L"Define _PQS_LEAK_DETECTION for real data here", 0); } return p; } #else // !(defined(_PQS_LEAK_DETECTION) && defined(_DEBUG)) //////////////////////////////////////////////////////////////////////////////// // // Debug ON // Debug ON // Debug ON // //////////////////////////////////////////////////////////////////////////////// #include #include #include #include #include "Injector.h" #include "Excption.h" //////////////////////////////////////////////////////////////////////////////// // // Throws an exception in case it is recommended by the injector. // //////////////////////////////////////////////////////////////////////////////// inline void Inject( ULONG ulSize, const char * szFileName, int nLine) { if (DoInjection(ulSize, szFileName, nLine)) { THROW_MEMORY_EXCEPTION(); } } //////////////////////////////////////////////////////////////////////////////// // // Add injection to the CRT debug allocation routines. // //////////////////////////////////////////////////////////////////////////////// inline void* dbgRealloc( void * p, size_t s, const char * szFileName, int nLine) { Inject(s,szFileName,nLine); return _realloc_dbg(p, s, _NORMAL_BLOCK, szFileName, nLine); } inline void* dbgMalloc( unsigned int s, const char * szFileName, int nLine ) { Inject(s,szFileName,nLine); return _malloc_dbg(s, _NORMAL_BLOCK, szFileName, nLine); } //////////////////////////////////////////////////////////////////////////////// // // Add exception throwing on NULL allocation. Add Injector support. // //////////////////////////////////////////////////////////////////////////////// inline void* __cdecl operator new(size_t s, const char* pszFile, unsigned long ulLine) throw (CMemoryException) { Inject(s, pszFile, ulLine); void *p = _malloc_dbg(s, _NORMAL_BLOCK, pszFile, ulLine); if (NULL == p) { WCHAR rwchFilename[1000]; mbstowcs(rwchFilename, pszFile, sizeof(rwchFilename) / sizeof(rwchFilename[0])); throw CMemoryException(rwchFilename, ulLine); } return p; } //////////////////////////////////////////////////////////////////////////////// // // Unwinding placment delete operator exists only in VC 6 and up // //////////////////////////////////////////////////////////////////////////////// inline void __cdecl operator delete(void * _P, const char *, unsigned long) { ::operator delete(_P); } //////////////////////////////////////////////////////////////////////////////// // // Redirect malloc, realloc and new to the debug version specifying // allocation location. // //////////////////////////////////////////////////////////////////////////////// #undef malloc #define malloc(s) dbgMalloc(s, __FILE__, __LINE__) #undef realloc #define realloc(p, s) dbgRealloc(p, s, __FILE__, __LINE__) #define DEBUG_NEW new(__FILE__,__LINE__) #define new DEBUG_NEW #endif // !(defined(_PQS_LEAK_DETECTION) && defined(_DEBUG)) #endif MEMORYMANAGEMENT_H