]> git.mxchange.org Git - simgear.git/commitdiff
SubsystemMgr: prevent double delete and use shared pointers.
authorThomas Geymayer <tomgey@gmail.com>
Thu, 19 Nov 2015 22:10:11 +0000 (23:10 +0100)
committerThomas Geymayer <tomgey@gmail.com>
Fri, 20 Nov 2015 11:34:46 +0000 (12:34 +0100)
simgear/structure/subsystem_mgr.cxx
simgear/structure/subsystem_mgr.hxx

index f9eb752b8742ba0f7af2e0334052964f61e01fd6..5e26a4320fbb305aa28cf5f02561d31df4c23c9d 100644 (file)
@@ -301,8 +301,6 @@ SGSubsystemGroup::set_subsystem (const string &name, SGSubsystem * subsystem,
                                  double min_step_sec)
 {
     Member * member = get_member(name, true);
-    if (member->subsystem != 0)
-        delete member->subsystem;
     member->name = name;
     member->subsystem = subsystem;
     member->min_step_sec = min_step_sec;
@@ -430,11 +428,11 @@ SGSubsystemGroup::Member::update (double delta_time_sec)
 
 
 SGSubsystemMgr::SGSubsystemMgr () :
+  _groups(MAX_GROUPS),
   _initPosition(0)
 {
-  for (int i = 0; i < MAX_GROUPS; i++) {
-    _groups[i] = new SGSubsystemGroup;
-  }
+  for (int i = 0; i < MAX_GROUPS; i++)
+    _groups[i].reset(new SGSubsystemGroup);
 }
 
 SGSubsystemMgr::~SGSubsystemMgr ()
@@ -442,10 +440,7 @@ SGSubsystemMgr::~SGSubsystemMgr ()
   // ensure get_subsystem returns NULL from now onwards,
   // before the SGSubsystemGroup destructors are run
   _subsystem_map.clear();
-  
-  for (int i = 0; i < MAX_GROUPS; i++) {
-    delete _groups[i];
-  }
+  _groups.clear();
 }
 
 void
index caa804e8edaadbad68fc7e80b3153483211063eb..4139fa68c4e4e224159bd1ec25b4664e3f241c23 100644 (file)
@@ -345,6 +345,8 @@ private:
     unsigned int _initPosition;
 };
 
+typedef SGSharedPtr<SGSubsystemGroup> SGSubsystemGroupRef;
+
 /**
  * Manage subsystems for FlightGear.
  *
@@ -413,9 +415,9 @@ public:
     void setReportTimingCb(void* userData,SGSubsystemTimingCb cb) {reportTimingCb = cb;reportTimingUserData = userData;}
 
 private:
-    SGSubsystemGroup* _groups[MAX_GROUPS];
+    std::vector<SGSubsystemGroupRef> _groups;
     unsigned int _initPosition;
-  
+
     // non-owning reference
     typedef std::map<std::string, SGSubsystem*> SubsystemDict;
     SubsystemDict _subsystem_map;