有个内存管理的问题想请教一下大家:
有如下一个结构
struct Node
{
int nDestCount; //手机号码个数
char DestItem[21*N];//手机号码,一个手机号码占21个长度,N为手机号码个数,最大不能超过1000个
char cMsg[160]; //内容
}如下类实现内存管理
class CQueueBuffObj
{
struct NodeFreeHead
{
Node Data;
NodeFreeHead * next;
};
private:
const int nMaxCount; // 结点最大数
int nFreeCount; // 当前空闲结点
NodeFreeHead * FreeListHead; // 链表头结点 NodeFreeHead * CreateAlloc()
{
NodeFreeHead * pBuf; = NULL;
if( FreeListHead == NULL )
{
pBuf = (NodeFreeHead*)::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(NodeFreeHead) );
}else
{
pBuf = FreeListHead;
FreeListHead = FreeListHead->next;
pBuf->next = NULL;
--nFreeCount;
}
return pBuf;
}
CQueueBuffObj():nMaxCount(100),nFreeCount(0){}
};
客户端的手机号码个数可能是(1~100个)如果只有一个号码则Node.DestItem+21的地址处就可以开始存放内容;
如果客户端的手机号码个数为20个,则Node.DestItem+(21*20)处的地址才开始存放内容
这个在客户端处很容易实现,但是在服务端内存管理我不知该怎么办才好,如果按100个号码的长度即内存大小为4+21*100+160的话,如果客户端提交的号码个数为150个(4+21*150+160)比之前分配的内存要大,则空闲内存中内存大小不够,如果客户端提交的号码只有一个(4+21+160),就显得浪费内存,请问高手这个该怎么做才算好
有如下一个结构
struct Node
{
int nDestCount; //手机号码个数
char DestItem[21*N];//手机号码,一个手机号码占21个长度,N为手机号码个数,最大不能超过1000个
char cMsg[160]; //内容
}如下类实现内存管理
class CQueueBuffObj
{
struct NodeFreeHead
{
Node Data;
NodeFreeHead * next;
};
private:
const int nMaxCount; // 结点最大数
int nFreeCount; // 当前空闲结点
NodeFreeHead * FreeListHead; // 链表头结点 NodeFreeHead * CreateAlloc()
{
NodeFreeHead * pBuf; = NULL;
if( FreeListHead == NULL )
{
pBuf = (NodeFreeHead*)::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(NodeFreeHead) );
}else
{
pBuf = FreeListHead;
FreeListHead = FreeListHead->next;
pBuf->next = NULL;
--nFreeCount;
}
return pBuf;
}
CQueueBuffObj():nMaxCount(100),nFreeCount(0){}
};
客户端的手机号码个数可能是(1~100个)如果只有一个号码则Node.DestItem+21的地址处就可以开始存放内容;
如果客户端的手机号码个数为20个,则Node.DestItem+(21*20)处的地址才开始存放内容
这个在客户端处很容易实现,但是在服务端内存管理我不知该怎么办才好,如果按100个号码的长度即内存大小为4+21*100+160的话,如果客户端提交的号码个数为150个(4+21*150+160)比之前分配的内存要大,则空闲内存中内存大小不够,如果客户端提交的号码只有一个(4+21+160),就显得浪费内存,请问高手这个该怎么做才算好
http://faq.csdn.net/read/216668.html
然后定义一个增量单位,比如 10 个号码。这样,当空间不足时候,
按照增量单位扩展空间。算是比较折衷的办法,
其实也是STL内存管理方法的一个简化 ...
请看懂我的问题。
=============================
dyw(道不同不相为谋)
你说的是客户端那种情况,动态分配结构大小,我现在问的是服务器商内存管理怎么去管理,因为结构大小不定,我不想每接到一个包就分配一个内存,而是在内存管理池中有空闲内存则调用,否则再分配。如果这样分配的话不是得用一个变量指向号码的地址空间,每次接收包时先看包里手机号码个数再分配,是不是这样??
struct Node
{
int nDestCount; //手机号码个数
char *DestItem;//手机号码,一个手机号码占21个长度,N为手机号码个数,最大不能超过1000个
char cMsg[160]; //内容
};pBuf = (NodeFreeHead*)::HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, sizeof(NodeFreeHead) );
pBuf->DestItem = (char*)::HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,size);
size是手机号码个数*21如:手机号码个数为120则size=120*21而释放时只释放pBuf->DestItem的空间,其它保留存到内存管理的列表中,
那这样我也用不着内存管理了啊。内存管理的用图是在大量分配释放内存的情况下使用,不必过快的分配释放内存
=================================
jixingzhong(瞌睡虫·星辰)
你的做法不还是在申请内存方面。
===========================================
我的目的是释放内存的时候不是真正释放,而是存在一个列表中,以后申请时先查看该列表中是否有空闲内存,如果有则从该列表中取出,否则重新申请。不知道是不是我的问题没有说清楚
这个只是基本的链表操作,跟内存管理有什么关系啊?