[DEBUG]记一次野指针调试

本文记录了一次野指针导致的随机错误调试经历。在游戏开发中,由于更新流程的问题,当实体删除时,其对应的视觉对象未能正确清理,造成野指针在某些条件下仍能调用成员函数,引发一系列诡异错误。经过详细排查,作者意识到VS的堆检查机制有限,且XP与Win7系统的堆管理差异可能导致错误表现不同。最后,作者提醒开发者,SAFE_DELETE虽能避免部分问题,但并不能完全解决野指针风险,强调对代码流程的全面理解和谨慎编程的重要性。
摘要由CSDN通过智能技术生成

关于野指针,我觉得最可怕的情况就是,它在程序大部分时候都不会出错,当你项目越来越大的时候,可能就会出现各种随机性诡异错误了,而这时你压根就不会想到是自己很久前的一次疏忽。

我在shero里用的实体框架是这样的,逻辑对象为Entity,视觉对象为Visual,Visual根据Entity来渲染自己,所以它保存了一个Entity指针m_pEntity。

更新流程是:

Entity->Update();

Visual->Update();

当Entity需要删除时,将m_canDel置为true。

所以在EntityManager的更新里就是这样:

if (m_canDel)  delete pEntity;

但是Viusual怎么办呢,Entity没有保存Visual指针,没法通知它需要删除,所以我是这样更新的:

if(m_pEntity->CanDel())  delete pVisual;

倒霉的是,当m_pEntity为野指针后,m_pEntity->CanDel()还真为true。。所以一直没发觉。


 

DEBUG就是这样,源头找到后就会觉得很简单,如果就这样自大的一笑了之,那以后肯定继续被它虐。所以重要的还是对过程的一些反思:

首先,我这种情况就会产生一些随机性诡异错误,而且源头是在其他模块里,比如这个BUG很早以来就一直存在,而且很早前我也发现过一个由于它导致的堆损坏。当时我查到的源头是在Audio模块里,而且只是某个怪物的音效才会出错。所以,我当时的结论是:嗯,这个怪物的音效文件有误࿰

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值