]> git.mxchange.org Git - flightgear.git/commitdiff
Miscellaneous tweaks and Bugfixes. Mostly memory leaks ported from the plib
authordurk <durk>
Sat, 20 Oct 2007 08:36:21 +0000 (08:36 +0000)
committerdurk <durk>
Sat, 20 Oct 2007 08:36:21 +0000 (08:36 +0000)
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
src/GUI/new_gui.cxx
src/Instrumentation/gps.cxx
src/Main/globals.cxx
src/Navaids/navlist.cxx
src/Navaids/navlist.hxx
src/Navaids/navrecord.hxx

index 60519cc69a6651b063a9476380e5ba8d41fe1a2b..8b38de6639829aa11182c61f7cb1851c6a2368b5 100644 (file)
@@ -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() {
index fa1abaf5353003824d339829b9de0a8facc2441f..667f257644a2a1464e9920c27d25d0c030f0a470 100644 (file)
@@ -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
index b466948c42d3a1bc08ff96283de84c1154f2b25f..76b8974bf71aa4c54cdbaa0132e9522888c41b38 100644 (file)
@@ -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();
 
index ffb8a9fb21c20f4eff372de9b10ed8832f886f58..531308068c8298a0838e6aeb7a91d4b495f39ef4 100644 (file)
 #  include <config.h>
 #endif
 
+#include <simgear/scene/model/modellib.hxx>
 #include <simgear/sound/soundmgr_openal.hxx>
 #include <simgear/structure/commands.hxx>
 #include <simgear/misc/sg_path.hxx>
-
+#include <simgear/timing/sg_time.hxx>
+#include <simgear/ephemeris/ephemeris.hxx>
+#include <simgear/magvar/magvar.hxx>
+#include <simgear/scene/material/matlib.hxx>
+
+#include <Aircraft/controls.hxx>
+#include <Airports/runways.hxx>
+#include <ATC/AIMgr.hxx>
+#include <ATC/ATCmgr.hxx>
+#include <Autopilot/route_mgr.hxx>
+#include <Cockpit/panel.hxx>
 #include <GUI/new_gui.hxx>
+#include <Model/acmodel.hxx>
+#include <Model/modelmgr.hxx>
+#include <MultiPlayer/multiplaymgr.hxx>
+#include <Navaids/awynet.hxx>
+#include <Scenery/scenery.hxx>
+#include <Scenery/tilemgr.hxx>
 
 #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;
 }
 
 
index bc2fcbd44820acc73107203d0438c9c1d6dcc254..a145bac0d9d5d7090e4c237597062da2234d6366 100644 (file)
@@ -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();
index cdf178db3a3cf3179389ae4fb1d1a5a87b91cd7e..3b6a2fa42aab4d4fb7649d033835af964cbcfed5 100644 (file)
@@ -27,6 +27,8 @@
 
 #include <simgear/compiler.h>
 #include <simgear/misc/sg_path.hxx>
+#include <simgear/structure/SGSharedPtr.hxx>
+#include <simgear/structure/SGReferenced.hxx>
 
 #include <map>
 #include <vector>
@@ -42,8 +44,8 @@ SG_USING_STD(string);
 
 // FGNavList ------------------------------------------------------------------
 
-
-typedef vector < FGNavRecord* > nav_list_type;
+typedef SGSharedPtr<FGNavRecord> 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<FGTACANRecord> 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;
 
index 90e719a8e9f55d47eca563a1acb3fb9f4e741e79..ab1a95088ae3971e23be5628beb2c82ddb3accd5 100644 (file)
@@ -32,6 +32,9 @@
 #include <simgear/magvar/magvar.hxx>
 #include <simgear/timing/sg_time.hxx>
 
+#include <simgear/structure/ssgSharedPtr.hxx>
+#include <simgear/structure/SGReferenced.hxx>
+
 #ifdef SG_HAVE_STD_INCLUDES
 #  include <istream>
 #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;