2014-01-10 2 views
0

Я переключаю сцены, когда мой персонаж выигрывает или проигрывает игру. Я получаю сообщение о том, что освобожденный указатель не был выделен.Игра падает при смене сцен, освобождение указателя не выделено

Иногда игра не разбивается и возвращается к игровому виду. Но иногда игра вылетает в основном на этой линии:

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); 
} 

Когда я не освободил объект модели он работает как шарм. Однако, в инициализации моего конструктора я делаю это:

pModel = Model::create(); 

Так что я не знаю, почему pModel будет указатель, который будет освобождена, но не выделяется?

ответ

0

Я предполагаю, что вы не сохранили свой объект pModel. Функция Create обычно автоматически очищает объект, и если вы его не сохраните, он будет удален до того момента, когда вы назовете «free (pModel)» в деструкторе.

0

Вам не нужно бесплатно снимать объект pModel в деструкторе, как в функции создания, создаваемый объект добавляется к autorelease pool. Итак, что происходит здесь, так это то, что вначале, когда пул авторекламы истощает, он автоматически освобождает память, выделенную pModel. И когда деструктор контроллера называется free(pModel); пытается освободить память, которая уже освобождена.

0

Когда вы заменяете сцену, вызывается деструктор предыдущей сцены. Если вы освободите объект, созданный с помощью функции create() cocos, поскольку он уже добавлен в пул автозапуска, управляемый cocos, пул пытается освободить (удалить) уже удаленный (в деструкторе с помощью бесплатного) указатель. поэтому, не используйте ручное удаление для объектов cocos, созданных с помощью функций create.

Смежные вопросы