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

最近在开发D3D DirectX 游戏的时候,调试游戏游戏客户端退出游戏的时候发现一个奇怪的错误,没有办法跟踪堆栈,尤其是10万行代码的工程,找错误如同大海捞针。

在这里插入图片描述
看了下百度,应该是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[i].Key))
		{
		   //将堆栈内存指针直接添加到游戏内存中,因为堆栈内存在Dll中映射,此处应该先new 然后memcpy
			m_GameProtectInfoList.Add(&msg->GameProtectInfo[i],msg->GameProtectInfo[i].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 ,就不会出现问题。

评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值