]> git.mxchange.org Git - flightgear.git/commitdiff
While I had the valgrind rig set up, I took the opportunity to plug a
authorandy <andy>
Fri, 10 Mar 2006 22:21:42 +0000 (22:21 +0000)
committerandy <andy>
Fri, 10 Mar 2006 22:21:42 +0000 (22:21 +0000)
bunch of memory leaks that had accumulated over the years.  FlightGear
doesn't currently bother to destroy and recreate a YASim context, but
at least it can do so now without worry.

src/FDM/YASim/Airplane.cpp
src/FDM/YASim/Airplane.hpp
src/FDM/YASim/FGFDM.cpp
src/FDM/YASim/Vector.hpp
src/FDM/YASim/yasim-test.cpp

index e9763673e3eecce6741a1ea2ec9665349a4f31a0..4f49c9216bbe1e722e0e13078ab4cf9606719cfe 100644 (file)
@@ -60,14 +60,35 @@ Airplane::~Airplane()
        delete (Tank*)_tanks.get(i);
     for(i=0; i<_thrusters.size(); i++)
        delete (ThrustRec*)_thrusters.get(i);
-    for(i=0; i<_gears.size(); i++)
-       delete (GearRec*)_gears.get(i);
+    for(i=0; i<_gears.size(); i++) {
+       GearRec* g = (GearRec*)_gears.get(i);
+        delete g->gear;
+        delete g;
+    }
     for(i=0; i<_surfs.size(); i++)
        delete (Surface*)_surfs.get(i);    
-    for(i=0; i<_contacts.size(); i++)
-        delete[] (float*)_contacts.get(i);
+    for(i=0; i<_contacts.size(); i++) {
+        ContactRec* c = (ContactRec*)_contacts.get(i);
+        delete c->gear;
+        delete c;
+    }
     for(i=0; i<_solveWeights.size(); i++)
-        delete[] (SolveWeight*)_solveWeights.get(i);
+        delete (SolveWeight*)_solveWeights.get(i);
+    for(i=0; i<_cruiseControls.size(); i++)
+        delete (Control*)_cruiseControls.get(i);
+    for(i=0; i<_approachControls.size(); i++) {
+        Control* c = (Control*)_approachControls.get(i);
+        if(c != &_approachElevator)
+            delete c;
+    }
+    delete _wing;
+    delete _tail;
+    for(i=0; i<_vstabs.size(); i++)
+        delete (Wing*)_vstabs.get(i);
+    for(i=0; i<_weights.size(); i++)
+        delete (WeightRec*)_weights.get(i);
+    for(i=0; i<_rotors.size(); i++)
+        delete (Rotor*)_rotors.get(i);
 }
 
 void Airplane::iterate(float dt)
@@ -415,11 +436,12 @@ void Airplane::setupState(float aoa, float speed, State* s)
 
 void Airplane::addContactPoint(float* pos)
 {
-    float* cp = new float[3];
-    cp[0] = pos[0];
-    cp[1] = pos[1];
-    cp[2] = pos[2];
-    _contacts.add(cp);
+    ContactRec* c = new ContactRec;
+    c->gear = 0;
+    c->p[0] = pos[0];
+    c->p[1] = pos[1];
+    c->p[2] = pos[2];
+    _contacts.add(c);
 }
 
 float Airplane::compileWing(Wing* w)
@@ -595,10 +617,11 @@ void Airplane::compileContactPoints()
 
     int i;
     for(i=0; i<_contacts.size(); i++) {
-        float *cp = (float*)_contacts.get(i);
+        ContactRec* c = (ContactRec*)_contacts.get(i);
 
         Gear* g = new Gear();
-        g->setPosition(cp);
+        c->gear = g;
+        g->setPosition(c->p);
         
         g->setCompression(comp);
         g->setSpring(spring);
index 8c46c46f5688507b984d3dd12cf15ea32e91b145..762ff33fdc98c4e8eafb1cc29e65e25301f2d7d3 100644 (file)
@@ -100,6 +100,7 @@ private:
     struct Control { int control; float val; };
     struct WeightRec { int handle; Surface* surf; };
     struct SolveWeight { bool approach; int idx; float wgt; };
+    struct ContactRec { Gear* gear; float p[3]; };
 
     void runCruise();
     void runApproach();
index b72e7fa5543b16695f4a10b7d5209465f65dd790..426a35ed43a92d1e26e4547a144366be4a3bb31b 100644 (file)
@@ -83,6 +83,7 @@ FGFDM::~FGFDM()
     }
     for(i=0; i<_controlProps.size(); i++)
         delete (PropOut*)_controlProps.get(i);
+    delete _turb;
 }
 
 void FGFDM::iterate(float dt)
index db8c8c7196a49b953b2df11d73a9d08b5f68621a..ea647a30d1356e743ffc8fef195edfcddb2927ea 100644 (file)
@@ -10,6 +10,7 @@
 class Vector {
 public:
     Vector();
+    ~Vector();
     int   add(void* p);
     void* get(int i);
     void  set(int i, void* p);
@@ -29,6 +30,11 @@ inline Vector::Vector()
     _array = 0;
 }
 
+inline Vector::~Vector()
+{
+    delete[] _array;
+}
+
 inline int Vector::add(void* p)
 {
     if(_nelem == _sz)
index 7f578b6a9665063f4320bbb9009e15b454398db1..d00a564bb509c6289583d01dec9aa9fdc5487117 100644 (file)
@@ -22,12 +22,13 @@ static const float RAD2DEG = 57.2957795131;
 
 int main(int argc, char** argv)
 {
-    FGFDM fdm;
-    Airplane* a = fdm.getAirplane();
+    FGFDM* fdm = new FGFDM();
+    Airplane* a = fdm->getAirplane();
 
     // Read
     try {
-        readXML(argv[1], fdm);
+        string file = argv[1];
+        readXML(file, *fdm);
     } catch (const sg_exception &e) {
         printf("XML parse error: %s (%s)\n",
                e.getFormattedMessage().c_str(), e.getOrigin().c_str());
@@ -53,4 +54,8 @@ int main(int argc, char** argv)
 
     if(a->getFailureMsg())
         printf("SOLUTION FAILURE: %s\n", a->getFailureMsg());
+
+    delete fdm;
+
+    return 0;
 }