bool Allocator::_Check() const { bool res = true; for (BlockNode* pNode = m_pBlocks ; pNode != NULL ; pNode = pNode->pNext) { Header* pHeader = reinterpret_cast<Header*>(pNode->pBlock); Footer* pFooter = reinterpret_cast<Footer*>(pNode->pBlock+sizeof(Header)+pHeader->m_iSize); res &= pHeader->Check(); res &= pFooter->Check(); } return true; }
void Allocator::_Free(void* ptr, const char* file_name, unsigned int line_num) { //LOG("%s:%d free(%p)\n", file_name, line_num, ptr); byte* pBlock = (byte*)ptr - sizeof(Header); Header* pHeader = reinterpret_cast<Header*>(pBlock); Footer* pFooter = reinterpret_cast<Footer*>((byte*)ptr+pHeader->m_iSize); ASSERT(pHeader->Check()); ASSERT(pFooter->Check()); ASSERT(pHeader->m_pBlockNode != NULL); RemBlock(pBlock); free(pBlock); }