更改场景时游戏崩溃,指针被释放未分配

时间:2014-01-10 12:23:28

标签: cocos2d-x exc-bad-access

当我的角色赢或输时,我正在切换场景。我收到一条消息,说没有分配被释放的指针。

有时,游戏不会崩溃,它会回到游戏视图。但有时游戏在这一行的主要游戏中崩溃了:

int retVal = UIApplicationMain(argc, argv, nil, @"AppController");

错误是“访问不良”;

我使用CCdirector切换到结束屏幕:

cocos2d::CCDirector::sharedDirector()->replaceScene(GameWon::scene());

然后在GameWon.cpp中我创建了一个新游戏场景来开始一个新游戏:

  cocos2d::CCDirector::sharedDirector()->replaceScene(Controller::scene());

不知道是什么导致了这个问题。奇怪的是,它并不总是在模拟器上崩溃。有什么提示吗?

修改

所以我发现问题是什么,我只是不知道为什么这是一个问题。显然,当我创建一个新场景时,会调用Controller的析构函数。在这个析构函数中,我释放了我的模型对象:

Controller::~Controller()
{
    free(pModel);
}

当我不释放模型对象时,它就像一个魅力。但是,在我的构造函数的init中,我这样做:

 pModel = Model::create();

所以我不确定为什么pModel会被释放,但是没有分配?

3 个答案:

答案 0 :(得分:0)

我的猜测是你没有保留你的pModel对象。创建函数通常自动释放对象,如果不保留它,它将在析构函数中调用“free(pModel)”时删除。

答案 1 :(得分:0)

您不需要在析构函数中手动释放pModel对象,就像在创建函数中一样,正在创建的对象被添加到autorelease pool。所以这里发生的事情是,首先当自动释放池耗尽时,它会自动释放分配给pModel的内存。当调用控制器的析构函数时,free(pModel);尝试释放已释放的内存。

答案 2 :(得分:0)

替换场景时,将调用前一场景的析构函数。如果释放使用cocos的create()函数创建的对象,因为它已经在cocos管理的自动释放池中添加,池尝试释放(删除)已经删除(在析构函数中使用free)指针。所以,不要对使用create functions创建的cocos对象使用手动删除。