cocos2d-x中各种诡异BUG的一个原因
2014-01-03 10:32
337 查看
void
CCObject::release(void)
{
CCAssert(m_uReference > 0, "reference count should greater than 0");
--m_uReference;
if (m_uReference == 0)
{
delete this;
}
}
刚开始看到这段cocos2d-x代码的时候感觉很神奇,delete还可以这么用,但后来由于这块引发了一个超诡异BUG,这个BUG祸害了我整整两天的时间,症状是这样:从一个界面切换到其他界面的时候偶尔会闪退,有时候连着触发,有时候20次都不触发,测了两天发现每次XCode断点的地方都不一样,查到后来终于发现原因:在这个界面被析构之后我手欠地把一个本地指针变量置成了NULL,代码大致是这样:
void MyGameState::onActionFinish()
{
......
Game::switchGameState() // 切换界面,释放当前界面并创建新的界面,在这里MyClass被delete掉了
if (popPanel != NULL)
{
popPanel = NULL;
}
}
其实就相当于一个对象再delete this之后又修改了自己的变量,但这时候变量已经不存在了,它的内存可能已经被别的人用了,你把别人的内存改了以后就可能引发各种诡异错误。
C++ FAQ里关于delete this的说明:http://www.parashift.com/c++-faq-lite/delete-this.html
CCObject::release(void)
{
CCAssert(m_uReference > 0, "reference count should greater than 0");
--m_uReference;
if (m_uReference == 0)
{
delete this;
}
}
刚开始看到这段cocos2d-x代码的时候感觉很神奇,delete还可以这么用,但后来由于这块引发了一个超诡异BUG,这个BUG祸害了我整整两天的时间,症状是这样:从一个界面切换到其他界面的时候偶尔会闪退,有时候连着触发,有时候20次都不触发,测了两天发现每次XCode断点的地方都不一样,查到后来终于发现原因:在这个界面被析构之后我手欠地把一个本地指针变量置成了NULL,代码大致是这样:
void MyGameState::onActionFinish()
{
......
Game::switchGameState() // 切换界面,释放当前界面并创建新的界面,在这里MyClass被delete掉了
if (popPanel != NULL)
{
popPanel = NULL;
}
}
其实就相当于一个对象再delete this之后又修改了自己的变量,但这时候变量已经不存在了,它的内存可能已经被别的人用了,你把别人的内存改了以后就可能引发各种诡异错误。
C++ FAQ里关于delete this的说明:http://www.parashift.com/c++-faq-lite/delete-this.html
相关文章推荐
- (译)一个cocos2d节点不显示的各种原因
- 一个诡异的bug
- 神似安卓官方的一个bug。(原因找到)
- 和各种诡异 Bug 打交道 13 年,我总结了 18 个经验
- 发现一个规律:如果google上搜不到程序报错原因,意味着隐藏着一个非常2B的bug
- Eclipse换行莫名其妙多了一个右花括号(Eclipse最诡异的BUG)
- 解决cocos2d-x pvr.ccz格式的图片有时无法读取的一个bug
- cocos2d-x ios 多点触控只取出一个点,原因
- Cocos2d-x 各种诡异问题经验记录
- [cocos2d-x]CCHttpClient的一个bug
- 跟各种诡异 Bug 打交道 13 年后的总结
- ShareSDK造成App崩溃的一个BUG原因分析以及Fix方法
- 发现Visual Studio和Word之间的一个诡异bug
- Cocos2d-x 3.0 JNI BUG 修复。(Android 如何创建一个线程 延迟执行函数 创建一个随机数)
- Bug不知道该怎么找?找不到程序崩溃的原因?今天推荐一个第三方的工具
- 微信、手机QQ,网易新闻等几乎大部分Android App的一个诡异的Bug,求高手出招?
- cocos2d-js在web使用时,一定要把资源加入到resource.js里面~~否则各种bug
- 微信、手机QQ,网易新闻等几乎大部分Android App的一个诡异的Bug,求高手出招?
- 一个诡异的BUG: Python导入的模块运行过程中变成了None
- 多继承引发的诡异bug (cocos2d-x CCObject)