]> git.mxchange.org Git - flightgear.git/commitdiff
Fix a FlightPlan lifetime issue.
authorJames Turner <zakalawe@mac.com>
Sun, 26 May 2013 21:11:11 +0000 (22:11 +0100)
committerJames Turner <zakalawe@mac.com>
Sun, 26 May 2013 21:11:25 +0000 (22:11 +0100)
Route-manager was explicitly deleting its FP, which was incorrect.
Switch to correct use of SGSharedPtr to refer to flight plans.

Thanks to Roland Haeder for catching this.

src/Autopilot/route_mgr.cxx
src/Autopilot/route_mgr.hxx
src/Navaids/FlightPlan.cxx
src/Navaids/FlightPlan.hxx

index 3773c2e06c3f90022bcd9d9fa9f5fcc8103ee7e8..b1259f7915c164d6cdba64b7ae098f40ce8eadd9 100644 (file)
@@ -401,12 +401,12 @@ bool FGRouteMgr::loadRoute(const SGPath& p)
   return true;
 }
 
-FlightPlan* FGRouteMgr::flightPlan() const
+FlightPlanRef FGRouteMgr::flightPlan() const
 {
   return _plan;
 }
 
-void FGRouteMgr::setFlightPlan(FlightPlan* plan)
+void FGRouteMgr::setFlightPlan(const FlightPlanRef& plan)
 {
   if (plan == _plan) {
     return;
@@ -414,7 +414,6 @@ void FGRouteMgr::setFlightPlan(FlightPlan* plan)
   
   if (_plan) {
     _plan->removeDelegate(this);
-    delete _plan;
     active->setBoolValue(false);
   }
   
index 9fddc80f940e8b889263f6e5d9e4e3d4c7b1c0ec..696d43d618854f965fb24b4cb2889375e72a7fbe 100644 (file)
@@ -55,8 +55,8 @@ public:
          
   int currentIndex() const;
   
-  void setFlightPlan(flightgear::FlightPlan* plan);
-  flightgear::FlightPlan* flightPlan() const;
+  void setFlightPlan(const flightgear::FlightPlanRef& plan);
+  flightgear::FlightPlanRef flightPlan() const;
   
   void clearRoute();
   
@@ -104,7 +104,7 @@ private:
     bool commandDefineUserWaypoint(const SGPropertyNode* arg);
     bool commandDeleteUserWaypoint(const SGPropertyNode* arg);
     
-    flightgear::FlightPlan* _plan;
+    flightgear::FlightPlanRef _plan;
   
     time_t _takeoffTime;
     time_t _touchdownTime;
index f19345ec34ee4deb56907b680d35e2e6321f497f..2087d5cc1fb165c1efb6b0f990ad05811854ef6f 100644 (file)
@@ -91,6 +91,11 @@ FlightPlan::~FlightPlan()
       delete cur;
     }
   }
+    
+// delete legs
+    BOOST_FOREACH(Leg* l, _legs) {
+        delete l;
+    }
 }
   
 FlightPlan* FlightPlan::clone(const string& newIdent) const
@@ -1193,18 +1198,16 @@ FlightPlan::Delegate::Delegate() :
   _deleteWithPlan(false),
   _inner(NULL)
 {
-  
 }
 
 FlightPlan::Delegate::~Delegate()
-{
-  
+{  
 }
 
 void FlightPlan::Delegate::removeInner(Delegate* d)
 {
   if (!_inner) {
-    return;
+      throw sg_exception("FlightPlan delegate not found");
   }
   
   if (_inner == d) {
index 836730e229186ead4011c8f23ab576f0ba56ede6..ceb5c9d19731b06266bf112cdfaa0517d1bde5f5 100644 (file)
@@ -31,7 +31,10 @@ namespace flightgear
 {
 
 class Transition;
-
+class FlightPlan;
+    
+typedef SGSharedPtr<FlightPlan> FlightPlanRef;
+    
 class FlightPlan : public RouteBase
 {
 public: