cocos2d-x中各种诡异BUG的一个原因

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值