有个内存管理的问题想请教一下大家:
有如下一个结构
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),就显得浪费内存,请问高手这个该怎么做才算好

解决方案 »

  1.   

    1.在stl中的实现方法是: 当用户请求的内存够时,则分配用户足够的;如果内存不够时,则实现客户 请求的数目的两倍,然后再发送给用户需求的东西。但需要注意就是如果认为用户的请求内存是非法的,则不给用户适当的东西,直接返回错误。
      

  2.   

    cMsg定长,DestItem可变,二者交换一下位置。然后参考:
    http://faq.csdn.net/read/216668.html
      

  3.   

    给定一个初始长度 INITIAL_SIZE,比如20个号码
    然后定义一个增量单位,比如 10 个号码。这样,当空间不足时候,
    按照增量单位扩展空间。算是比较折衷的办法,
    其实也是STL内存管理方法的一个简化 ...
      

  4.   

    shanhqk(山) 
    请看懂我的问题。
    =============================
    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(瞌睡虫·星辰) 
    你的做法不还是在申请内存方面。
    ===========================================
    我的目的是释放内存的时候不是真正释放,而是存在一个列表中,以后申请时先查看该列表中是否有空闲内存,如果有则从该列表中取出,否则重新申请。不知道是不是我的问题没有说清楚
      

  5.   

    看不懂你做了什么内存管理,事实上你的FreeListHead每次都是空,每次都是重新分配的内存,然后放到链表中去,
    这个只是基本的链表操作,跟内存管理有什么关系啊?