关于大小不变的对象的内存池管理
来源:互联网 发布:linux代理服务器 编辑:程序博客网 时间:2024/06/05 06:55
这是我写的一个简单的内存管理类,主要是用在:如果有种大小不变的对象要频繁的new和delete,为了防止产生大量的内存碎片和提高效率,可以考虑使用下面的内存管理类。下一篇文章,我将介绍如何使用这个类
#ifndef _MEMPOOL_H
#define _MEMPOOL_H
/********************************************************************
created: 2004/11/29
created: 29:11:2004 16:02
filename: ../memory pool/test/cmempool.h
file path: ../memory pool/test
file base: cmempool
file ext: h
author: David
purpose: 同等大小的小对象如果频繁的动态申请与释放(eg: s
erver),必然会导致系统产生大量的内存碎片,这样
当系统长时间的运行后,就会因为大量的内存碎片而
导致无法再分配出内存,这样我们的软件就会变的不
稳定,而且频繁的new和delete会导致效率低下,因此
需要有自己内存管理。下面的类就是一个简单的内存
管理。
*********************************************************************/
#include "Lock.h"
template <class CNode>
struct Mem_Pool_Node
{
union {
char Obj[sizeof(CNode)];
Mem_Pool_Node *m_pNext;
};
};
template <class CNode>
class CMemPool
{
typedef Mem_Pool_Node<CNode>* Mem_Pool_Node_Type;
public:
CMemPool(){
m_pListFreePool = NULL;
m_nInuse = 0;
m_nFree = 0;
};
virtual ~CMemPool(){
Mem_Pool_Node_Type pPreNode= NULL;
Mem_Pool_Node_Type pNode= NULL;
m_Lock.Lock();
pPreNode = m_pListFreePool;
pNode = m_pListFreePool;
while (NULL != pNode) {
pPreNode = pNode;
pNode = pNode->m_pNext;
delete pPreNode;
pPreNode = NULL;
}
m_Lock.Unlock();
};
CNode *Allocate(){
void *p = NULL;
Mem_Pool_Node_Type pNode= NULL;
if (NULL == m_pListFreePool) {
try{
p = (::operator new(sizeof(CNode)));
}
catch (...) {
if (p != NULL) {
::operator delete ((CNode *)(p));
p = NULL;
}
return NULL;
}
m_Lock.Lock();
m_nInuse++;
m_Lock.Unlock();
}
else{
m_Lock.Lock();
pNode = m_pListFreePool;
m_pListFreePool = m_pListFreePool->m_pNext;
p = pNode;
m_nFree--;
m_nInuse++;
m_Lock.Unlock();
}
return static_cast<CNode *>(p);
};
void Release(void *p){
if (NULL == p) {
return;
}
m_Lock.Lock();
if (NULL == m_pListFreePool) {
m_pListFreePool = static_cast<Mem_Pool_Node_Type>(p);
m_pListFreePool->m_pNext = NULL;
}
else{
(static_cast<Mem_Pool_Node_Type>(p))->m_pNext = m_pListFreePool;
m_pListFreePool = static_cast<Mem_Pool_Node_Type>(p);
}
m_nInuse--;
m_nFree++;
m_Lock.Unlock();
};
void GetInfo(int &inuse, int &free){
inuse = m_nInuse;
free = m_nFree;
};
private:
CLock m_Lock;
int m_nInuse;
int m_nFree;
Mem_Pool_Node_Type m_pListFreePool;
};
#endif
- 关于大小不变的对象的内存池管理
- 大小不变的对象的内存管理类的使用
- 对象的内存管理
- 内存管理:频繁申请大量(同等大小)小对象的优化内存策略
- 单线程固定大小对象的内存池实现
- 单线程不固定大小对象的内存池实现
- 单线程环境中对象大小可变的内存池
- 单线程环境中对象大小固定的内存池
- 对象大小固定的单线程内存池设计
- Nib 对象的内存管理
- OC对象的内存管理
- 对象内存管理的学习
- 多对象的内存管理
- C++对象所占内存的大小
- java常用对象的内存占用大小
- 一个关于图片压缩的java类,大小变小,宽度高度不变
- 单个对象的内存管理 内存泄露
- 关于内存单元和寄存器的大小
- 利用Asp.net 动态创建DataList
- Taglib原理和实现
- Session过期问题
- Calling WebServices using Javascript
- 无法加载DLL(OCI.DLL),如何解决?
- 关于大小不变的对象的内存池管理
- 最新Tomcat配置最新发现
- Asp.net中的页面乱码的问题
- j2ee程序员应该掌握的linux知识
- 清除网页历史记录
- 【转]】水瓶的爱情
- 事务全攻略
- 象素字体入门
- 绕过Windows Rootkit检测系统(转至 www.rootkit.com )