花2小时写的一个内存管理的小类,请大家看看。该如何解决
花2小时写的一个内存管理的小类,请大家看看。
#include <afxmt.h>
#include <afxtempl.h>
//不知道要不要考虑分页及字节对齐等使起始地址和大小有影响的东东
struct MemInfo
{
unsigned int iMemSize;
bool bUse;
void* pMem;//标识内存的起始地址
};
typedef CArray <MemInfo*,MemInfo*> CMemArray;
class CMemoryManager
{
public:
bool HasInit();
CMemoryManager();
virtual ~CMemoryManager();
void* MemNew(size_t size);
void MemDelete(void* p);
bool Init();//最开始来标识是否成功
private:
void DoMemCombinate(int iIndex,MemInfo* pInfo);
private:
void* m_pMem;
CMemArray m_oMemArray;
CCriticalSection m_cs;
HANDLE m_hHeap;
};
CPP:
CMemoryManager::CMemoryManager()
{
m_pMem = NULL;
m_hHeap = NULL;
m_oMemArray.RemoveAll();
}
CMemoryManager::~CMemoryManager()
{
for(int i = 0; i < m_oMemArray.GetSize(); i++)
{
MemInfo* pInfo = m_oMemArray.GetAt(i);
delete pInfo;
//dont delete pInfo-> pMem;
}
m_oMemArray.RemoveAll();
//256kb
if(NULL != m_pMem)
{
HeapFree(m_hHeap,0x40000,m_pMem);
HeapDestroy(m_hHeap);
}
}
bool CMemoryManager::Init()
{
m_hHeap = HeapCreate(HEAP_NO_SERIALIZE,0x40500,0x50000);
if(NULL == m_hHeap)
{
return false;
}
m_cs.Lock();
m_pMem = HeapAlloc(m_hHeap,HEAP_ZERO_MEMORY,0x40000);
if(NULL == m_pMem)
{
m_cs.Unlock();
return false;
}
//delete
MemInfo* pInfo = new MemInfo;
if(NULL == pInfo)
{
m_cs.Unlock();
return false;
}
pInfo-> pMem = m_pMem;
pInfo-> iMemSize = 0x40000;
pInfo-> bUse = false;
m_oMemArray.Add(pInfo);
m_cs.Unlock();
return true;
}
//要不要比size大点?
void* CMemoryManager::MemNew(size_t size)
{
MemInfo* pTemp = NULL;//标识空闲块
unsigned int uiSize = 0;
for(int i = 0 ; i < m_oMemArray.GetSize(); i++)
{
MemInfo* pInfo = m_oMemArray.GetAt(i);
if(NULL != pInfo)
{
//找最小块
if(pInfo-> iMemSize > = size && !pInfo-> bUse)
{
if(uiSize <= 0)
{
uiSize = pInfo-> iMemSize;
pTemp = pInfo;
}
else
{
if(pInfo-> iMemSize < uiSize)
{
uiSize = pInfo-> iMemSize;
pTemp = pInfo;
}
}
}
}
}
if(NULL == pTemp)
{
return NULL;
}
m_cs.Lock();
if(pTemp-> iMemSize == size)
{
pTemp-> bUse = true;
m_cs.Unlock();
return pTemp-> pMem;
}
else
{
MemInfo* pNewInfo = new MemInfo;
pNewInfo-> iMemSize = size;
pNewInfo-> bUse = true;
#include <afxmt.h>
#include <afxtempl.h>
//不知道要不要考虑分页及字节对齐等使起始地址和大小有影响的东东
struct MemInfo
{
unsigned int iMemSize;
bool bUse;
void* pMem;//标识内存的起始地址
};
typedef CArray <MemInfo*,MemInfo*> CMemArray;
class CMemoryManager
{
public:
bool HasInit();
CMemoryManager();
virtual ~CMemoryManager();
void* MemNew(size_t size);
void MemDelete(void* p);
bool Init();//最开始来标识是否成功
private:
void DoMemCombinate(int iIndex,MemInfo* pInfo);
private:
void* m_pMem;
CMemArray m_oMemArray;
CCriticalSection m_cs;
HANDLE m_hHeap;
};
CPP:
CMemoryManager::CMemoryManager()
{
m_pMem = NULL;
m_hHeap = NULL;
m_oMemArray.RemoveAll();
}
CMemoryManager::~CMemoryManager()
{
for(int i = 0; i < m_oMemArray.GetSize(); i++)
{
MemInfo* pInfo = m_oMemArray.GetAt(i);
delete pInfo;
//dont delete pInfo-> pMem;
}
m_oMemArray.RemoveAll();
//256kb
if(NULL != m_pMem)
{
HeapFree(m_hHeap,0x40000,m_pMem);
HeapDestroy(m_hHeap);
}
}
bool CMemoryManager::Init()
{
m_hHeap = HeapCreate(HEAP_NO_SERIALIZE,0x40500,0x50000);
if(NULL == m_hHeap)
{
return false;
}
m_cs.Lock();
m_pMem = HeapAlloc(m_hHeap,HEAP_ZERO_MEMORY,0x40000);
if(NULL == m_pMem)
{
m_cs.Unlock();
return false;
}
//delete
MemInfo* pInfo = new MemInfo;
if(NULL == pInfo)
{
m_cs.Unlock();
return false;
}
pInfo-> pMem = m_pMem;
pInfo-> iMemSize = 0x40000;
pInfo-> bUse = false;
m_oMemArray.Add(pInfo);
m_cs.Unlock();
return true;
}
//要不要比size大点?
void* CMemoryManager::MemNew(size_t size)
{
MemInfo* pTemp = NULL;//标识空闲块
unsigned int uiSize = 0;
for(int i = 0 ; i < m_oMemArray.GetSize(); i++)
{
MemInfo* pInfo = m_oMemArray.GetAt(i);
if(NULL != pInfo)
{
//找最小块
if(pInfo-> iMemSize > = size && !pInfo-> bUse)
{
if(uiSize <= 0)
{
uiSize = pInfo-> iMemSize;
pTemp = pInfo;
}
else
{
if(pInfo-> iMemSize < uiSize)
{
uiSize = pInfo-> iMemSize;
pTemp = pInfo;
}
}
}
}
}
if(NULL == pTemp)
{
return NULL;
}
m_cs.Lock();
if(pTemp-> iMemSize == size)
{
pTemp-> bUse = true;
m_cs.Unlock();
return pTemp-> pMem;
}
else
{
MemInfo* pNewInfo = new MemInfo;
pNewInfo-> iMemSize = size;
pNewInfo-> bUse = true;