void __cdecl xf_free ( void * _Memory #ifdef TRACK_MEMORY_ALLOCATIONS , LPCSTR lpszFileName, int nLine #endif ) { if (!_Memory) { return; // Nothing to do } if (!ghHeap) { //_ASSERTE(ghHeap && _Memory); #ifdef _DEBUG _CrtDbgBreak(); #endif return; } #ifdef TRACK_MEMORY_ALLOCATIONS xf_mem_block* p = ((xf_mem_block*)_Memory)-1; if (p->bBlockUsed == TRUE) { int nCCcmp = memcmp(((LPBYTE)_Memory)+p->nBlockSize, "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC", 8); _ASSERTE(nCCcmp == 0); memset(_Memory, 0xFD, p->nBlockSize); } else { _ASSERTE(p->bBlockUsed == TRUE); } p->bBlockUsed = FALSE; msprintf(p->sCreatedFrom, countof(p->sCreatedFrom), "-- %s:%i", _PointToName(lpszFileName), nLine); _Memory = (void*)p; #endif #ifdef _DEBUG size_t _Size1 = HeapSize(ghHeap, 0, _Memory); _ASSERTE(_Size1 > 0); #endif HeapFree(ghHeap, 0, _Memory); #ifdef FORCE_HEAP_CHECK xf_dump_chk(); #endif //#ifdef _DEBUG //SIZE_T _Size2 = HeapSize(ghHeap, 0, _Memory); //if (_Size1 == _Size2) { // _ASSERTE(_Size1 != _Size2); //} //#endif }
void* __cdecl xf_realloc ( void * _Memory, size_t _Size #ifdef TRACK_MEMORY_ALLOCATIONS , LPCSTR lpszFileName, int nLine #endif ) { _ASSERTE(ghHeap); _ASSERTE(_Size>0); #ifdef TRACK_MEMORY_ALLOCATIONS xf_mem_block* pOld = ((xf_mem_block*)_Memory)-1; size_t _Size1 = HeapSize(ghHeap, 0, pOld); _ASSERTE(_Size1 < (_Size+sizeof(xf_mem_block)+8)); size_t _Size2 = 0; if (pOld->bBlockUsed == TRUE) { int nCCcmp = memcmp(((LPBYTE)_Memory)+pOld->nBlockSize, "\xCC\xCC\xCC\xCC\xCC\xCC\xCC\xCC", 8); _ASSERTE(nCCcmp == 0); _ASSERTE(_Size1 == (pOld->nBlockSize+sizeof(xf_mem_block)+8)); _Size2 = pOld->nBlockSize; } else { _ASSERTE(pOld->bBlockUsed == TRUE); if (_Size1 > (sizeof(xf_mem_block)+8)) _Size2 = _Size1 - (sizeof(xf_mem_block)+8); } xf_mem_block* p = (xf_mem_block*)HeapReAlloc(ghHeap, 0, pOld, _Size+sizeof(xf_mem_block)+8); if (p) { p->bBlockUsed = TRUE; p->nBlockSize = _Size; msprintf(p->sCreatedFrom, countof(p->sCreatedFrom), "%s:%i", _PointToName(lpszFileName), nLine); #ifdef _DEBUG if (_Size > _Size2) memset(((LPBYTE)(p+1))+_Size2, 0xFD, _Size - _Size2); #endif memset(((LPBYTE)(p+1))+_Size, 0xCC, 8); } else { _ASSERTE(p!=NULL); } return p?(p+1):p; #else void* p = HeapReAlloc(ghHeap, HEAP_ZERO_MEMORY, _Memory, _Size); return p; #endif }
void * __cdecl xf_malloc ( size_t _Size #ifdef TRACK_MEMORY_ALLOCATIONS , LPCSTR lpszFileName, int nLine #endif ) { _ASSERTE(ghHeap); _ASSERTE(_Size>0); #ifdef TRACK_MEMORY_ALLOCATIONS #ifdef FORCE_HEAP_CHECK xf_dump_chk(); #endif size_t nTotalSize = _Size+sizeof(xf_mem_block)+8; xf_mem_block* p = (xf_mem_block*)HeapAlloc(ghHeap, 0, nTotalSize); if (p) { p->bBlockUsed = TRUE; p->nBlockSize = _Size; msprintf(p->sCreatedFrom, countof(p->sCreatedFrom), "%s:%i", _PointToName(lpszFileName), nLine); #ifdef _DEBUG if (_Size > 0) memset(p+1, 0xFD, _Size); #endif memset(((LPBYTE)(p+1))+_Size, 0xCC, 8); } else { _ASSERTE(p!=NULL); } return p?(p+1):p; #else void* p = HeapAlloc(ghHeap, 0, _Size); return p; #endif }
void xf_set_tag(void* _Memory, LPCSTR lpszFileName, int nLine, bool bAlloc /*= true*/) { _ASSERTE(_Memory); xf_mem_block* p = ((xf_mem_block*)_Memory)-1; if (bAlloc) { _ASSERTE(p && p->bBlockUsed && p->nBlockSize); p->nThreadID = GetCurrentThreadId(); p->nAllocTick = GetTickCount(); p->nFreeTick = 0; p->nSrcLine = LOWORD(nLine); lstrcpynA(p->sSrcFile, _PointToName(lpszFileName), countof(p->sSrcFile)); } else { _ASSERTE(p && !p->bBlockUsed && p->nBlockSize); p->nFreeTick = GetTickCount(); //msprintf(p->sSrcFile, countof(p->sSrcFile), "-- %s:%i", _PointToName(lpszFileName), nLine); } }