Exemplo n.º 1
0
	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;

		// 可以尝试释放内存单元 
	}
Exemplo n.º 2
0
	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;
		}
	}
Exemplo n.º 3
0
static Block*
_allocb(int size)
{
	return mem2block(mallocz(blocksize(size), 0), size, 1);
}