/**//******************************************************************************* Notice: Copyright (c) 2007 Some - All Rights Reserved **** create: turui**** Date: 2007.12.19**** File Name: TRSimpleGc.c** ** Revision: **** Description: **** 简单的垃圾回收及管理*******************************************************************************/#include <stdio.h>#include <malloc.h>#include "TRSimpleGC.h" // 定义一些只在本文件中使用的宏#define HeaderSize (sizeof(void*)) // 定义存储数据的数据结构typedef struct MemBlock _MemBlock; struct MemBlock...{ _MemBlock* pPrev; char buffer[BlockSize];}; // 定义只在本文件中使用的静态变量,并初始化static BYTE* m_begin = (BYTE*)HeaderSize;static BYTE* m_end = (BYTE*)HeaderSize; // 获取链表头static _MemBlock* const _ChainHeader()...{ return (_MemBlock *)(m_begin - HeaderSize);} void * gc_malloc(UINT32 cb)...{ if(cb > (UINT32)((m_end-m_begin))) ...{ _MemBlock* pNowHeader = _ChainHeader(); // 用来记录用户新申请内存的指针 // 也可以叫做内存块,因为包含了一个对这个指针的记录及一个数据存储区域 _MemBlock* pNewMemBlock = NULL; // 这里根据用户用户请求的内存块的大小 // 来判断是使用默认块大小还是开辟足够的内存 if(cb >= BlockSize) ...{ pNewMemBlock = (_MemBlock*)malloc(HeaderSize + cb); } else ...{ // 这里开辟的内存的大小为_MemBlock // 即 sizeof(_MemBlock *) + BlockSize // 也等于 HeaderSize + BlockSize // 则下面开辟内存也可以换成这句 // _MemBlock* pNew = (_MemBlock*)malloc(HeaderSize + BlockSize); pNewMemBlock = (_MemBlock*)malloc(sizeof(_MemBlock)); } // 将新内存块的链指针指向之前的内存块 pNewMemBlock->pPrev = pNowHeader; // 重新设置m_begin指针,将 m_begin 指向新内存块的开始 m_begin = pNewMemBlock->buffer; // 将 m_end 指向新内存块的结尾处 if(cb >= BlockSize) m_end = pNewMemBlock->buffer + cb; else m_end = pNewMemBlock->buffer + BlockSize; } // 将 m_end 从后向前移动 cb 个字节 // 并将这一段内存交给用户使用 m_end -= cb; return m_end;} void gc_free()...{ _MemBlock* pHeader = _ChainHeader(); while (pHeader) ...{ _MemBlock* pTemp = pHeader->pPrev; free(pHeader); pHeader = pTemp; } m_begin = m_end = (char*)HeaderSize;}