• [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;
    }
  • 相关阅读:
    使用truffle测试部署合约
    nodejs promise深度解析
    pthread线程特定数据
    基于信号量与互斥锁实现的生产者和消费者
    Linux coredump 的打开和关闭
    Linux 双网卡配置两个IP同时只有一个会通的原因
    进程间通信-共享内存
    进程间通信-消息队列
    TCP/IP SIGPIPE信号
    Select模式和超时
  • 原文地址:https://www.cnblogs.com/byfei/p/14104143.html
Copyright © 2020-2023  润新知