From f5e9e1898fee4217af4142dbac50960f1391855b Mon Sep 17 00:00:00 2001 From: durk Date: Sat, 20 Oct 2007 08:36:21 +0000 Subject: [PATCH] Miscellaneous tweaks and Bugfixes. Mostly memory leaks ported from the plib version * Delete ai list objects in ~ATC/AIMgr.cxx:AIMgr::~AIMgr() * Delete colors in GUI/new_gui.cxx: NewGui::~NewGui.cxx * Delete memory allocated to the class member "route" in Instrumentation/gps.cxx * Delete all globals (except a few "unsafe" ones that still cause segfaults and need further examination. * Use an SGShared pointer for navaid memory allocation, so that pointers to individual navaid objects can be included safely in multiple navaid lists --- src/ATC/AIMgr.cxx | 3 ++ src/GUI/new_gui.cxx | 2 + src/Instrumentation/gps.cxx | 5 ++- src/Main/globals.cxx | 77 ++++++++++++++++++++++++++++++++----- src/Navaids/navlist.cxx | 9 ++++- src/Navaids/navlist.hxx | 10 +++-- src/Navaids/navrecord.hxx | 7 +++- 7 files changed, 95 insertions(+), 18 deletions(-) diff --git a/src/ATC/AIMgr.cxx b/src/ATC/AIMgr.cxx index 60519cc69..8b38de663 100644 --- a/src/ATC/AIMgr.cxx +++ b/src/ATC/AIMgr.cxx @@ -59,6 +59,9 @@ FGAIMgr::FGAIMgr() { } FGAIMgr::~FGAIMgr() { + for (ai_list_itr = ai_list.begin(); ai_list_itr != ai_list.end(); ai_list_itr++) { + delete (*ai_list_itr); + } } void FGAIMgr::init() { diff --git a/src/GUI/new_gui.cxx b/src/GUI/new_gui.cxx index fa1abaf53..667f25764 100644 --- a/src/GUI/new_gui.cxx +++ b/src/GUI/new_gui.cxx @@ -35,6 +35,8 @@ NewGUI::~NewGUI () { delete _menubar; _dialog_props.clear(); + for (_itt_t it = _colors.begin(); it != _colors.end(); ++it) + delete it->second; } void diff --git a/src/Instrumentation/gps.cxx b/src/Instrumentation/gps.cxx index b466948c4..76b8974bf 100644 --- a/src/Instrumentation/gps.cxx +++ b/src/Instrumentation/gps.cxx @@ -43,17 +43,20 @@ GPS::GPS ( SGPropertyNode *node) _distance_m(0), _course_deg(0), _name(node->getStringValue("name", "gps")), - _num(node->getIntValue("number", 0)) + _num(node->getIntValue("number", 0)), + route(0) { } GPS::~GPS () { + delete route; } void GPS::init () { + delete route; // in case init is called twice route = new SGRoute; route->clear(); diff --git a/src/Main/globals.cxx b/src/Main/globals.cxx index ffb8a9fb2..531308068 100644 --- a/src/Main/globals.cxx +++ b/src/Main/globals.cxx @@ -24,11 +24,28 @@ # include #endif +#include #include #include #include - +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include #include +#include +#include +#include +#include +#include +#include #include "globals.hxx" #include "renderer.hxx" @@ -97,15 +114,57 @@ FGGlobals::FGGlobals() : // Destructor FGGlobals::~FGGlobals() { - delete soundmgr; - delete subsystem_mgr; - delete event_mgr; - delete initial_state; - delete props; - delete io; - delete fontcache; delete renderer; - delete initial_waypoints; +// The AIModels manager performs a number of actions upon + // Shutdown that implicitly assume that other subsystems + // are still operational (Due to the dynamic allocation and + // deallocation of AIModel objects. To ensure we can safely + // shut down all subsystems, make sure we take down the + // AIModels system first. + subsystem_mgr->get_group(SGSubsystemMgr::GENERAL)->remove_subsystem("ai_model"); + delete subsystem_mgr; + delete event_mgr; + delete time_params; + delete ephem; + delete mag; + delete matlib; + delete route_mgr; + delete current_panel; + delete soundmgr; + delete airports; + + delete runways; + delete ATC_mgr; + delete AI_mgr; + delete controls; + delete viewmgr; + + delete initial_state; +// //delete locale; Don't delete locale +// delete commands; + delete model_lib; + delete acmodel; + delete model_mgr; + delete channel_options_list; + delete initial_waypoints; + delete scenery; + //delete tile_mgr; // Don't delete tile manager yet, because loader thread problems + delete io; + delete fontcache; + + delete navlist; + delete loclist; + delete gslist; + delete dmelist; + delete mkrlist; + delete tacanlist; + delete carrierlist; + delete channellist; + delete fixlist; + delete airwaynet; + delete multiplayer_mgr; + + delete props; } diff --git a/src/Navaids/navlist.cxx b/src/Navaids/navlist.cxx index bc2fcbd44..a145bac0d 100644 --- a/src/Navaids/navlist.cxx +++ b/src/Navaids/navlist.cxx @@ -54,13 +54,18 @@ FGNavList::FGNavList( void ) FGNavList::~FGNavList( void ) { + navaids_by_tile.erase( navaids_by_tile.begin(), navaids_by_tile.end() ); + nav_list_type navlist = navaids.begin()->second; + navaids.erase( navaids.begin(), navaids.end() ); } // load the navaids and build the map bool FGNavList::init() { - // FIXME: leaves all the individual navaid entries leaked + // No need to delete the original navaid structures + // since we're using an SGSharedPointer + nav_list_type navlist = navaids.begin()->second; navaids.erase( navaids.begin(), navaids.end() ); navaids_by_tile.erase( navaids_by_tile.begin(), navaids_by_tile.end() ); ident_navaids.erase( ident_navaids.begin(), ident_navaids.end() ); @@ -80,7 +85,7 @@ static void real_add( nav_map_type &navmap, const int master_index, // front end for add a marker beacon static void tile_add( nav_map_type &navmap, FGNavRecord *n ) { - double diff; + double diff = 0; double lon = n->get_lon(); double lat = n->get_lat(); diff --git a/src/Navaids/navlist.hxx b/src/Navaids/navlist.hxx index cdf178db3..3b6a2fa42 100644 --- a/src/Navaids/navlist.hxx +++ b/src/Navaids/navlist.hxx @@ -27,6 +27,8 @@ #include #include +#include +#include #include #include @@ -42,8 +44,8 @@ SG_USING_STD(string); // FGNavList ------------------------------------------------------------------ - -typedef vector < FGNavRecord* > nav_list_type; +typedef SGSharedPtr nav_rec_ptr; +typedef vector < nav_rec_ptr > nav_list_type; typedef nav_list_type::iterator nav_list_iterator; typedef nav_list_type::const_iterator nav_list_const_iterator; @@ -114,8 +116,8 @@ public: // FGTACANList ---------------------------------------------------------------- - -typedef vector < FGTACANRecord* > tacan_list_type; +typedef SGSharedPtr tacan_rec_ptr; +typedef vector < tacan_rec_ptr > tacan_list_type; typedef map < int, tacan_list_type > tacan_map_type; typedef map < string, tacan_list_type > tacan_ident_map_type; diff --git a/src/Navaids/navrecord.hxx b/src/Navaids/navrecord.hxx index 90e719a8e..ab1a95088 100644 --- a/src/Navaids/navrecord.hxx +++ b/src/Navaids/navrecord.hxx @@ -32,6 +32,9 @@ #include #include +#include +#include + #ifdef SG_HAVE_STD_INCLUDES # include #elif defined( __BORLANDC__ ) || (__APPLE__) @@ -58,7 +61,7 @@ enum fg_nav_types { FG_NAV_ANY }; -class FGNavRecord { +class FGNavRecord : public SGReferenced { int type; SGGeod pos; // location in geodetic coords (degrees) @@ -194,7 +197,7 @@ operator >> ( istream& in, FGNavRecord& n ) return in; } -class FGTACANRecord { +class FGTACANRecord : public SGReferenced { string channel; int freq; -- 2.39.5