游戏服务器内存管理笔记

1:C++中对应数组越界的处理是。越界不报错也不提示。但是访问数组时出现野指针会报内存错误。也就是其它程序访问到了这段内存的话因为不对才报错


2:玩家离线数据保存于加载;从DB那边得到数据,DB发给引擎数据.引擎给进行装载处理。放进离线指针中
离线信息:
@CallTimers UpdateRankData 刷新了排行榜以后DB会发送引擎数据,重新更新排行榜。这是最新的内容。如果需要访问一个不再排行榜上面的用户则需要重新装载:
pUser= GetGlobalLogicEngine()->GetOfflineUserMgr().GetUserByActorId(ActorId, true); //如果不存在就去装载  所以也就是说每小时会进行一次更新
最主要的是访问空指针会报错


3:内存管理器概念:

    inline CUserItem* allocItem(const bool boNewSeries, LPCSTR file, INT_PTR line)
    {
        CheckItemAllocThread(file,line);
        CItemData* pItem = allocObject();

        if(pItem ==NULL)
        {
            OutputMsg(rmError,"alloc Item Fail");
            return NULL;
        }
        if(pItem->btUsed)
        {
            OutputMsg(rmError,"[ItemTrace],allocItem item reused item,oldfile=%s,oldline=%d,itemId=%d,count=%d,curFile=%s,curLine=%d",
                pItem->file?pItem->file:"" ,(int)pItem->line,(int)pItem->wItemId,(int)pItem->btCount,file,(int)line);

            OutputMsg(rmTip,"realloc a new item");
            return allocItem(boNewSeries,file,line);
        }

        if(boNewSeries)
        {
            memset(pItem, 0, sizeof(*pItem));
            //产生物品系列号
            pItem->series.t.time    = m_ItemTime;
            pItem->series.t.wServerId = (WORD)m_nServerIndex;
            pItem->series.t.wSeries = (WORD)m_nItemSeries;
            //单位时间内的系列号值递增
            m_nItemSeries++;
        }
        pItem->file = file;
        pItem->line =line;
        pItem->btUsed =true;
        m_nTotalAllocItemCount ++;
        AddItemLog(file,line);
        return (CUserItem*)pItem;
    }

    void DestroyUserItem(CUserItem *pUserItem, LPCSTR file, INT_PTR line)
    {
        CheckItemAllocThread(file,line);
        CItemData *pUserData = (CItemData *)pUserItem;
        if(pUserData->btUsed ==false)
        {
            OutputMsg(rmError,"[ItemTrace],DestroyUserItem item again,oldfile=%s,oldline=%d,itemId=%d,count=%d,curFile=%s,curLine=%d",
                pUserData->file?pUserData->file:"" ,(int)pUserData->line,(int)pUserData->wItemId,(int)pUserData->btCount,file,(int)line);
            return ;
        }
        pUserData->btUsed= false;
        if(m_nTotalAllocItemCount >0)
        {
            m_nTotalAllocItemCount --;
        }
        DecItemLog(pUserData->file,pUserData->line);
        freeObject(pUserData); 
    }

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值