当我的角色赢或输时,我正在切换场景。我收到一条消息,说没有分配被释放的指针。
有时,游戏不会崩溃,它会回到游戏视图。但有时游戏在这一行的主要游戏中崩溃了:
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会被释放,但是没有分配?
答案 0 :(得分:0)
我的猜测是你没有保留你的pModel对象。创建函数通常自动释放对象,如果不保留它,它将在析构函数中调用“free(pModel)”时删除。
答案 1 :(得分:0)
您不需要在析构函数中手动释放pModel
对象,就像在创建函数中一样,正在创建的对象被添加到autorelease pool
。所以这里发生的事情是,首先当自动释放池耗尽时,它会自动释放分配给pModel
的内存。当调用控制器的析构函数时,free(pModel);
尝试释放已释放的内存。
答案 2 :(得分:0)
替换场景时,将调用前一场景的析构函数。如果释放使用cocos的create()函数创建的对象,因为它已经在cocos管理的自动释放池中添加,池尝试释放(删除)已经删除(在析构函数中使用free)指针。所以,不要对使用create functions创建的cocos对象使用手动删除。