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