关于野指针,我觉得最可怕的情况就是,它在程序大部分时候都不会出错,当你项目越来越大的时候,可能就会出现各种随机性诡异错误了,而这时你压根就不会想到是自己很久前的一次疏忽。
我在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模块里,而且只是某个怪物的音效才会出错。所以,我当时的结论是:嗯,这个怪物的音效文件有误