[h5棋牌项目]-11-内存复用导致 map 数据重复


//红包结构体
struct tagRedPacket {
	tagRedPacket() { ReSet(); }
	void ReSet() { ZeroMemory(this, sizeof(tagRedPacket)); }
	LONGLONG		 lTime;									//发红包的时间
	WORD			 wId;									//红包id
	DWORD			 dwUserId;								//发红包的用户id
	DWORD			 dwCellScore;							//红包金额
	BYTE			 cbRay;									//雷
	DWORD			 dwRayCompensation;						//中雷赔偿金额
	BYTE			 cbRayCount;							//中雷次数
	BYTE			 cbTimeOut;								//过期标识 
	BYTE			 cbCount;								//红包数量
	CMD_S_PlayerInfo PlayerInfo;							//发送玩家信息
	tagOpenRedPacket wRedPacketUser[GAME_PLAYER];			//开红包数组
}; 

std::map<WORD, tagRedPacket*> m_RedPacketMgr;

tagRedPacket * RedPacketMgr::NewRedPacket()
{
	m_nMaxId++;
	for (std::map<WORD,tagRedPacket*>::iterator it = m_RedPacketMgr.begin(); it != m_RedPacketMgr.end();++it)
	{
		if (NULL == it->second) {
			m_RedPacketMgr.erase(it);
			break;
		}
		if(it->second->cbTimeOut){
			it->second->ReSet();
			it->second->wId = m_nMaxId;
			return it->second;
		}
	}
	tagRedPacket * pRedPacket = new tagRedPacket();
	pRedPacket->wId = m_nMaxId;
	return pRedPacket;
}

void RedPacketMgr::AddRedPacket(tagRedPacket *RedPacket)
{
	if(NULL == RedPacket)
		return;
	if (m_RedPacketMgr.find(RedPacket->wId) != m_RedPacketMgr.end())
		return;
	m_RedPacketMgr[RedPacket->wId] = RedPacket;
}

这样的代码 m_RedPacketMgr会出现包id重复

改下面这样
tagRedPacket * RedPacketMgr::NewRedPacket()
{
	m_nMaxId++;
	for (std::map<WORD,tagRedPacket*>::iterator it = m_RedPacketMgr.begin(); it != m_RedPacketMgr.end();++it)
	{
		tagRedPacket* ptagRedPacket = it->second;
		if (NULL == ptagRedPacket) {
			m_RedPacketMgr.erase(it);
			break;
		}
		//过期的红包
		if (ptagRedPacket->cbTimeOut) {
			m_RedPacketMgr.erase(it);
			delete ptagRedPacket;
			ptagRedPacket = NULL;
			break;
		}
	}
	tagRedPacket * pRedPacket = new tagRedPacket();
	pRedPacket->wId = m_nMaxId;
	return pRedPacket;
}

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值