⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 memmgr.cpp

📁 内存管理程序
💻 CPP
字号:
/*=========================================================
*	File name	:	memmgr.cpp
*	Description	:	内存管理:管理非固定长度内存,支持多线程
*					但注意有最大长度限制MAX_MEM_BLOCK,超过此长度内存由
*                   OS自己管理。
*
*	Modify  	:	
*=========================================================*/
#include "memmgr.h"
#include "fstream"
#include "globalref.h"

using namespace std;

memmgr g_pMemManger;


//inline
BYTE *MyMemAlloc(UINT bytes)
{
	return g_pMemManger.Alloc(bytes);
}

//inline 
void MyMemFree(void* block)
{
	g_pMemManger.Free((BYTE*)block);
}

void memmgr::ASSERT_MyMemBlock(void* block)
{
#ifdef _DEBUG
	if(block==NULL)
		return ;
	BYTE *x = (BYTE*)block-4;
	ASSERT(_CrtIsMemoryBlock((const void *)x, (*(UINT*)x)>>OFFSETSIZE, NULL, NULL, NULL ));
#endif
}

memmgr::memmgr()
{
#ifdef MEM_CONTROL_FLUX
	for( int i = 0; i < MAX_MEM_BLOCK >>OFFSETSIZE; i++ )g_CacheNum[i] = 0;
#endif
	memset(m_Cache,0,(MAX_MEM_BLOCK >>OFFSETSIZE)*sizeof(m_Cache[0]));
}

memmgr::~memmgr()
{
	for (UINT i=0; i < (MAX_MEM_BLOCK >>OFFSETSIZE); i++)
	{
		m_lock.Lock();
		if (m_Cache[i] != NULL) 
		{
			while (m_Cache[i] != NULL)
			{
				BYTE** x = (BYTE**) m_Cache[i];
				m_Cache[i] = *x;
#ifdef _DEBUG
				*(UINT*)(x) = (i<<OFFSETSIZE);
				VerifyMem((char*)x+4);
#endif
				free((BYTE*)x);
			}
		}
		m_lock.Unlock(8);
	}
	
}


void  memmgr::Load(const char *filename)
{
	ifstream fin;
	fin.open(filename);
	int nCount;
	for (UINT i=0; i < (MAX_MEM_BLOCK >>OFFSETSIZE); i++)
	{
		nCount = 0;
		fin>>nCount;
		for(int j = 0;j<nCount;j++)
		{
			void *p = malloc(i<<OFFSETSIZE);
			Free(p);
		}
	}
}

void  memmgr::Save(const char *filename)
{
	ofstream fout;
	fout.open(filename,ios::out|ios::trunc);
	int nCount = 0;
	for (UINT i=0; i < (MAX_MEM_BLOCK >>OFFSETSIZE); i++)
	{
		nCount = 0;
		m_lock.Lock();
		if (m_Cache[i] != NULL) 
		{
			while (m_Cache[i] != NULL)
			{
				BYTE** x = (BYTE**) m_Cache[i];
				m_Cache[i] = *x;
				nCount ++ ;
			}
		}
		fout<<nCount;
		fout<<"\n";
		m_lock.Unlock(9);
	}
}

#ifdef _DEBUG
void memmgr::VerifyMem(char *x)
{
	ASSERT(x);
	x = x-4;
	UINT bytes = *(UINT*)x;
	for(int i = 0;i<MEMMGR_SIZE_D;i++)
	{
		ASSERT(*(x+bytes+4+i) == 0x78);
	}
}

#else

void memmgr::VerifyMem(char *x)
{
}
#endif

BYTE* memmgr::Alloc(UINT bytes)
{
	if (bytes == 0)
		return NULL;

        bytes= MEMALIGN(bytes);
	UINT AllocBytes = bytes+4+MEMMGR_SIZE_D;
	BYTE* x;
	// Large block?
	if (bytes >= MAX_MEM_BLOCK)
	{
		x = (BYTE*)(malloc (AllocBytes));
#ifdef MEM_CONTROL_FLUX
		if (x == NULL)		
		{			
			printfmeminfo();
			return NULL;
		}	
#endif
		CHECKPOINTNULL(x, "memmgr::Alloc malloc fail!\r\n");
		*(UINT*)(x) = bytes;
#ifdef MEM_CONTROL_FLUX
		g_MemTotal = g_MemTotal + AllocBytes;
#endif
#ifdef _DEBUG
        memset(x+bytes+4,0x78,MEMMGR_SIZE_D);
#endif
		return x+4;
	}

	// No block in cache?
	UINT cindex = bytes >> OFFSETSIZE;
//	ASSERT(cindex>0);

	m_lock.Lock();
	x = m_Cache[cindex];
	if (x == NULL)
	{
		m_lock.Unlock(5);
		x = (BYTE*)(malloc (AllocBytes));
#ifdef MEM_CONTROL_FLUX
		if (x == NULL)		
		{			
			printfmeminfo();
			return NULL;
		}
#endif
		*(UINT*)(x) = bytes;
#ifdef MEM_CONTROL_FLUX
		g_MemTotal = g_MemTotal + AllocBytes;
#endif
#ifdef _DEBUG
        memset(x+bytes+4,0x78,MEMMGR_SIZE_D);
#endif
		return x+4;
	}

	// Return block from cache, update it
	BYTE** x_fp = (BYTE**) x;
	m_Cache[cindex] = *x_fp;
	*(UINT*)(x) = bytes;
	m_lock.Unlock(6);
#ifdef MEM_CONTROL_FLUX
	
	g_CacheNum[cindex]--;
#endif
	
       VerifyMem((char*)(x+4));
	return x+4;
}


void memmgr::Free (void* blk)
{
	if(blk==NULL)
		return ;

	VerifyMem((char*)blk);

	BYTE *x = (BYTE*)blk-4;
	UINT bytes = *(UINT*)x;
#ifdef MEM_CONTROL_FLUX
	UINT ncount = bytes;
#endif
	if (bytes >= MAX_MEM_BLOCK) 
	{
		free (x);
#ifdef MEM_CONTROL_FLUX
		g_MemTotal = g_MemTotal - ncount;
#endif
		return;
	}

	UINT cindex = bytes >> OFFSETSIZE;
	BYTE** blk_fp = (BYTE**) x;

#ifdef MEM_CONTROL_FLUX
	if( g_CacheNum[ cindex ] < MEM_MEMMGR_MAX)
	{
#endif
		m_lock.Lock();
		*blk_fp = m_Cache[cindex];
		m_Cache[cindex] = (BYTE*) x;
		m_lock.Unlock(7);
#ifdef MEM_CONTROL_FLUX
		g_CacheNum[ cindex ]++;
	}
	else
	{ 
		free( x );
		g_MemTotal = g_MemTotal - ncount;
	}
#endif
	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -