有个内存管理的问题想请教一下大家:
有如下一个结构
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),就显得浪费内存,请问高手这个该怎么做才算好
解决方案 »
- CoCreateInstance()传参的问题
- 如何连续响应鼠标单击而不响应双击?
- 为什么我没有修改程序每次按运行(!)仍然还问我是否重新编译?以前不是这样的
- [有关指纹识别问题]怎样引入图象
- 请问应用程序退出时提示内存不能为read,一般是什么原因.
- 在win32 console Application中-〉an application that supports MFC里的socket question,please help
- 关于两个视图中文件的拖动问题??急!!
- MFC:Combo box
- 关于状态栏的问题??
- 问一个关于XML的问题。求求各位大哥阿
- Unicode编程 如何找到
- c++求较 调了很久
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(瞌睡虫·星辰)
你的做法不还是在申请内存方面。
===========================================
我的目的是释放内存的时候不是真正释放,而是存在一个列表中,以后申请时先查看该列表中是否有空闲内存,如果有则从该列表中取出,否则重新申请。不知道是不是我的问题没有说清楚
这个只是基本的链表操作,跟内存管理有什么关系啊?