Fix reading freed memory after deleting world, plus add what it takes to detect further such issues easily

git-svn-id: svn+ssh://svn.code.sf.net/p/supertuxkart/code/main/trunk@12606 178a84e3-b1eb-0310-8ba1-8eac791a3b58
This commit is contained in:
auria
2013-04-04 23:09:53 +00:00
parent d807871ec6
commit 3cd4cc1cad
2 changed files with 73 additions and 42 deletions

View File

@@ -89,6 +89,11 @@ World* World::m_world = NULL;
*/
World::World() : WorldStatus(), m_clear_color(255,100,101,140)
{
#ifdef DEBUG
m_magic_number = 0xB01D6543;
#endif
m_physics = NULL;
m_race_gui = NULL;
m_saved_race_gui = NULL;
@@ -370,6 +375,11 @@ World::~World()
music_manager->stopMusic();
m_world = NULL;
#ifdef DEBUG
m_magic_number = 0xDEADBEEF;
#endif
} // ~World
//-----------------------------------------------------------------------------
@@ -664,6 +674,11 @@ void World::scheduleUnpause()
*/
void World::updateWorld(float dt)
{
#ifdef DEBUG
assert(m_magic_number == 0xB01D6543);
#endif
if (m_schedule_pause)
{
pause(m_scheduled_pause_phase);
@@ -691,55 +706,57 @@ void World::updateWorld(float dt)
{
enterRaceOverState();
}
if (m_schedule_exit_race)
else
{
race_manager->exitRace();
race_manager->setAIKartOverride("");
StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance());
if (m_schedule_tutorial)
if (m_schedule_exit_race)
{
race_manager->setNumLocalPlayers(1);
race_manager->setMajorMode (RaceManager::MAJOR_MODE_SINGLE);
race_manager->setMinorMode (RaceManager::MINOR_MODE_TUTORIAL);
race_manager->setNumKarts( 1 );
race_manager->setTrack( "tutorial" );
race_manager->setDifficulty(RaceManager::DIFFICULTY_EASY);
race_manager->exitRace();
race_manager->setAIKartOverride("");
// Use keyboard 0 by default (FIXME: let player choose?)
InputDevice* device = input_manager->getDeviceList()->getKeyboard(0);
StateManager::get()->resetAndGoToScreen(MainMenuScreen::getInstance());
if (m_schedule_tutorial)
{
race_manager->setNumLocalPlayers(1);
race_manager->setMajorMode (RaceManager::MAJOR_MODE_SINGLE);
race_manager->setMinorMode (RaceManager::MINOR_MODE_TUTORIAL);
race_manager->setNumKarts( 1 );
race_manager->setTrack( "tutorial" );
race_manager->setDifficulty(RaceManager::DIFFICULTY_EASY);
// Use keyboard 0 by default (FIXME: let player choose?)
InputDevice* device = input_manager->getDeviceList()->getKeyboard(0);
// Create player and associate player with keyboard
StateManager::get()->createActivePlayer(unlock_manager->getCurrentPlayer(),
device);
if (kart_properties_manager->getKart(UserConfigParams::m_default_kart) == NULL)
{
fprintf(stderr, "[MainMenuScreen] WARNING: cannot find kart '%s', will revert to default\n",
UserConfigParams::m_default_kart.c_str());
UserConfigParams::m_default_kart.revertToDefaults();
// Create player and associate player with keyboard
StateManager::get()->createActivePlayer(unlock_manager->getCurrentPlayer(),
device);
if (kart_properties_manager->getKart(UserConfigParams::m_default_kart) == NULL)
{
fprintf(stderr, "[MainMenuScreen] WARNING: cannot find kart '%s', will revert to default\n",
UserConfigParams::m_default_kart.c_str());
UserConfigParams::m_default_kart.revertToDefaults();
}
race_manager->setLocalKartInfo(0, UserConfigParams::m_default_kart);
// ASSIGN should make sure that only input from assigned devices
// is read.
input_manager->getDeviceList()->setAssignMode(ASSIGN);
input_manager->getDeviceList()
->setSinglePlayer( StateManager::get()->getActivePlayer(0) );
StateManager::get()->enterGameState();
network_manager->setupPlayerKartInfo();
race_manager->startNew(false);
}
race_manager->setLocalKartInfo(0, UserConfigParams::m_default_kart);
// ASSIGN should make sure that only input from assigned devices
// is read.
input_manager->getDeviceList()->setAssignMode(ASSIGN);
input_manager->getDeviceList()
->setSinglePlayer( StateManager::get()->getActivePlayer(0) );
StateManager::get()->enterGameState();
network_manager->setupPlayerKartInfo();
race_manager->startNew(false);
}
else
{
if (race_manager->raceWasStartedFromOverworld())
else
{
OverWorld::enterOverWorld();
if (race_manager->raceWasStartedFromOverworld())
{
OverWorld::enterOverWorld();
}
}
}
}
} // updateWorld
@@ -760,6 +777,11 @@ void World::scheduleTutorial()
*/
void World::update(float dt)
{
#ifdef DEBUG
assert(m_magic_number == 0xB01D6543);
#endif
PROFILER_PUSH_CPU_MARKER("World::update()", 0x00, 0x7F, 0x00);
#if MEASURE_FPS
@@ -801,6 +823,10 @@ void World::update(float dt)
projectile_manager->update(dt);
PROFILER_POP_CPU_MARKER();
#ifdef DEBUG
assert(m_magic_number == 0xB01D6543);
#endif
} // update
// ----------------------------------------------------------------------------

View File

@@ -72,6 +72,11 @@ private:
static World *m_world;
protected:
#ifdef DEBUG
int m_magic_number;
#endif
/** The list of all karts. */
KartList m_karts;
RandomGenerator m_random;