找回密码
 立即注册
查看: 34|回复: 0

c++ crtexe.c tmainCRTStartup 出错定位到 if (has_cctor == 0) _cexit(); 访问出错

[复制链接]

15

主题

2

回帖

81

积分

管理员

积分
81
发表于 6 天前 | 显示全部楼层 |阅读模式
最近在开发D3D DirectX 游戏的时候,调试游戏游戏客户端退出游戏的时候发现一个奇怪的错误,没有办法跟踪堆栈,尤其是10万行代码的工程,找错误如同大海捞针。

vs2010 最后出错位置:



看了下百度,应该是memcpy或者 delete 内存的问题,因为是退出游戏出现的错误,memcpy的可能性不大,肯定是在释放内存资源的时候,所以问题肯定出现在delete 删除内存指针的地方,经过反复查找,终于发现问题出现在反外挂的模块这里,代码如下:

  1. void GameProtectManager::SetGameProtectInfo(GAME_PROTECT_MSG * msg) //此处传递的是网络堆栈内存
  2. {
  3.         for(int i=0;i<msg->Count;i++)
  4.         {
  5.                 if(!m_GameProtectInfoList.GetData(msg->GameProtectInfo.Key))
  6.                 {
  7.                    //将堆栈内存指针直接添加到游戏内存中,因为堆栈内存在Dll中映射,此处应该先new 然后memcpy
  8.                         m_GameProtectInfoList.Add(&msg->GameProtectInfo,msg->GameProtectInfo.Key);
  9.                 }
  10.         }
  11. }
复制代码
然后清理的代码:
  1. GAME_PROTECT_INFO * GameProtectInfo =NULL;
  2. m_GameProtectInfoList.SetPositionHead();
  3.   while(GameProtectInfo = m_GameProtectInfoList.GetData())

  4.   {
  5.       //删除内存指针  此处要注意,直接释放指针即可,不可以Delete 因为在Dll中映射的内存,已经释放了
  6.      //delete GameProtectInfo;  //liuwei 此处直接网络堆栈添加的内存 使用delete 会出错 2021-01-02
  7.      GameProtectInfo = NULL;
  8. }
复制代码

  然后就弹出前面图示错误,出问题的原因是网络Dll中已经对数据包内存进行了映射,然后退出游戏的时候自己就释放了,但是我们却把指针添加到我们游戏类的内存块中了,然后析构函数会释放指针,释放一个已经释放了的指针,自然会出现访问冲突,解决方法,如果确定是其他地方已经释放的指针,析构函数中直接置空指针,不能delete, GameProtectInfo = NULL; 即可。或者,使用其他dll映射的指针对象的时候,先new 然后 memcpy ,析构中deletle ,就不会出现问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|软件开发编程门户 ( 陇ICP备2024013992号-1|甘公网安备62090002000130号 )

GMT+8, 2024-12-5 10:38 , Processed in 0.051831 second(s), 21 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表