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);
}