From 488337f6eb7d4c52d2d143d7fa23b5a3cca92f9f Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Fri, 21 May 2010 13:24:37 +0200 Subject: [PATCH] Engine: introduced deleteHelper() function The new deleteHelper() template function takes a pointer, saves it to a temporary, sets the passed pointer to NULL and then deletes the object it was referring to before. This way we can spot bugs caused by undesired references to global objects at shutdown more easily. (cherry picked from commit fe7d5e3d5a4b716aa65de66c15d0ab352aa75c77) --- include/engine.h | 14 ++++++++++++-- src/core/engine.cpp | 45 +++++++++++++++++---------------------------- src/core/track.cpp | 11 +++++++---- 3 files changed, 36 insertions(+), 34 deletions(-) diff --git a/include/engine.h b/include/engine.h index 2951edb38..669570379 100644 --- a/include/engine.h +++ b/include/engine.h @@ -1,8 +1,8 @@ /* * engine.h - engine-system of LMMS * - * Copyright (c) 2006-2008 Tobias Doerffel - * + * Copyright (c) 2006-2010 Tobias Doerffel + * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * This program is free software; you can redistribute it and/or @@ -160,6 +160,16 @@ public: private: + // small helper function which sets the pointer to NULL before actually deleting + // the object it refers to + template + static inline void deleteHelper( T * * ptr ) + { + T * tmp = *ptr; + *ptr = NULL; + delete tmp; + } + static bool s_hasGUI; static bool s_suppressMessages; static float s_framesPerTick; diff --git a/src/core/engine.cpp b/src/core/engine.cpp index 98d3b5cd0..ebc352011 100644 --- a/src/core/engine.cpp +++ b/src/core/engine.cpp @@ -3,8 +3,8 @@ /* * engine.cpp - implementation of LMMS' engine-system * - * Copyright (c) 2006-2008 Tobias Doerffel - * + * Copyright (c) 2006-2010 Tobias Doerffel + * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * This program is free software; you can redistribute it and/or @@ -115,43 +115,32 @@ void engine::destroy() { s_mixer->stopProcessing(); - delete s_projectNotes; - s_projectNotes = NULL; - delete s_songEditor; - s_songEditor = NULL; - delete s_bbEditor; - s_bbEditor = NULL; - delete s_pianoRoll; - s_pianoRoll = NULL; - delete s_automationEditor; - s_automationEditor = NULL; - - delete s_fxMixerView; - s_fxMixerView = NULL; + deleteHelper( &s_projectNotes ); + deleteHelper( &s_songEditor ); + deleteHelper( &s_bbEditor ); + deleteHelper( &s_pianoRoll ); + deleteHelper( &s_automationEditor ); + deleteHelper( &s_fxMixerView ); presetPreviewPlayHandle::cleanup(); InstrumentTrackView::cleanupWindowPool(); s_song->clearProject(); - delete s_bbTrackContainer; - s_bbTrackContainer = NULL; - delete s_dummyTC; - s_dummyTC = NULL; - delete s_mixer; - s_mixer = NULL; - delete s_fxMixer; - s_fxMixer = NULL; + deleteHelper( &s_bbTrackContainer ); + deleteHelper( &s_dummyTC ); - delete s_ladspaManager; + deleteHelper( &s_mixer ); + deleteHelper( &s_fxMixer ); + + deleteHelper( &s_ladspaManager ); //delete configManager::inst(); - delete s_projectJournal; - s_projectJournal = NULL; + deleteHelper( &s_projectJournal ); + s_mainWindow = NULL; - delete s_song; - s_song = NULL; + deleteHelper( &s_song ); delete configManager::inst(); } diff --git a/src/core/track.cpp b/src/core/track.cpp index 18962d22b..bc63a7b40 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -2,8 +2,8 @@ * track.cpp - implementation of classes concerning tracks -> necessary for * all track-like objects (beat/bassline, sample-track...) * - * Copyright (c) 2004-2009 Tobias Doerffel - * + * Copyright (c) 2004-2010 Tobias Doerffel + * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * * This program is free software; you can redistribute it and/or @@ -1796,8 +1796,11 @@ void track::removeTCO( trackContentObject * _tco ) if( it != m_trackContentObjects.end() ) { m_trackContentObjects.erase( it ); - engine::getSong()->updateLength(); - engine::getSong()->setModified(); + if( engine::getSong() ) + { + engine::getSong()->updateLength(); + engine::getSong()->setModified(); + } } }