void ChunkPool::free( void *ptr ) { if (NULL == ptr) return ; malloc_block* pDelMallocBlock = mem2block(ptr); if (!IS_MASK_OK(pDelMallocBlock->_head)) { // 校验内存块错误 return ; } if (m_blockSize != GET_BLOCK_LENGTH(pDelMallocBlock->_head)) { // 内存块释放长度问题 return ; } if (DEBUG_SWITCH_INIT_MEMORY) //debug调试 { memset(ptr, 0, m_blockSize - sizeof(muint32)); } // 更改使用状态 EXCHANGE_BLOCK_UNUSE(pDelMallocBlock->_head); pDelMallocBlock->_next = m_pBlockHead; m_pBlockHead = pDelMallocBlock; // 可以尝试释放内存单元 }
void MemoryPool::free( void *p, muint32 size ) { if (NULL == p) return ; malloc_block* pMallocBlock = mem2block(p); muint32 length = GET_BLOCK_LENGTH(pMallocBlock->_head); muint32 index = GET_CHUNKPOOL_INDEX(length-sizeof(muint32)); if (index < CHUNK_POOL_SIZE) { m_pChunkPool[index].free(p); } else { // 从进程堆分配内存 ::free(p); p = NULL; } }
static Block* _allocb(int size) { return mem2block(mallocz(blocksize(size), 0), size, 1); }