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

Cocos2d x 更改场景时游戏崩溃,指针被释放而未分配,cocos2d-x,exc-bad-access,Cocos2d X,Exc Bad Access,当我的角色赢得或输掉游戏时,我会切换场景。我收到一条消息说未分配要释放的指针 有时,游戏不会崩溃,而是返回到游戏视图。但有时游戏会在这条线上崩溃: int retVal = UIApplicationMain(argc, argv, nil, @"AppController"); 错误为“错误访问” 我使用CCdirector切换到结束屏幕: cocos2d::CCDirector::sharedDirector()->replaceScene(GameWon::scene()); 然

当我的角色赢得或输掉游戏时,我会切换场景。我收到一条消息说未分配要释放的指针

有时,游戏不会崩溃,而是返回到游戏视图。但有时游戏会在这条线上崩溃:

int retVal = UIApplicationMain(argc, argv, nil, @"AppController");
错误为“错误访问”

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

cocos2d::CCDirector::sharedDirector()->replaceScene(GameWon::scene());
然后在GameWon.cpp中,我创建一个新的游戏场景以开始一个新游戏:

  cocos2d::CCDirector::sharedDirector()->replaceScene(Controller::scene());
不知道是什么导致了这个问题。奇怪的是,它并不总是在模拟器上崩溃。有什么建议吗

编辑

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

Controller::~Controller()
{
    free(pModel);
}
当我不释放模型对象时,它就像一个符咒。但是,在构造函数的init中,我执行以下操作:

 pModel = Model::create();

所以我不确定为什么pModel会是一个被释放但没有分配的指针?

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

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

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