|
最近在开发D3D DirectX 游戏的时候,调试游戏游戏客户端退出游戏的时候发现一个奇怪的错误,没有办法跟踪堆栈,尤其是10万行代码的工程,找错误如同大海捞针。
vs2010 最后出错位置:
看了下百度,应该是memcpy或者 delete 内存的问题,因为是退出游戏出现的错误,memcpy的可能性不大,肯定是在释放内存资源的时候,所以问题肯定出现在delete 删除内存指针的地方,经过反复查找,终于发现问题出现在反外挂的模块这里,代码如下:
- void GameProtectManager::SetGameProtectInfo(GAME_PROTECT_MSG * msg) //此处传递的是网络堆栈内存
- {
- for(int i=0;i<msg->Count;i++)
- {
- if(!m_GameProtectInfoList.GetData(msg->GameProtectInfo.Key))
- {
- //将堆栈内存指针直接添加到游戏内存中,因为堆栈内存在Dll中映射,此处应该先new 然后memcpy
- m_GameProtectInfoList.Add(&msg->GameProtectInfo,msg->GameProtectInfo.Key);
- }
- }
- }
复制代码 然后清理的代码:
- GAME_PROTECT_INFO * GameProtectInfo =NULL;
- m_GameProtectInfoList.SetPositionHead();
- while(GameProtectInfo = m_GameProtectInfoList.GetData())
- {
- //删除内存指针 此处要注意,直接释放指针即可,不可以Delete 因为在Dll中映射的内存,已经释放了
- //delete GameProtectInfo; //liuwei 此处直接网络堆栈添加的内存 使用delete 会出错 2021-01-02
- GameProtectInfo = NULL;
- }
复制代码
然后就弹出前面图示错误,出问题的原因是网络Dll中已经对数据包内存进行了映射,然后退出游戏的时候自己就释放了,但是我们却把指针添加到我们游戏类的内存块中了,然后析构函数会释放指针,释放一个已经释放了的指针,自然会出现访问冲突,解决方法,如果确定是其他地方已经释放的指针,析构函数中直接置空指针,不能delete, GameProtectInfo = NULL; 即可。或者,使用其他dll映射的指针对象的时候,先new 然后 memcpy ,析构中deletle ,就不会出现问题。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
×
|