您的位置:首页 > 移动开发 > Cocos引擎

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  cocos2d-x c++ 内存