From: andy Date: Fri, 10 Mar 2006 22:21:42 +0000 (+0000) Subject: While I had the valgrind rig set up, I took the opportunity to plug a X-Git-Url: https://git.mxchange.org/?a=commitdiff_plain;h=6ed0ece57ce8a8db84c462a4a147b5e061043564;p=flightgear.git While I had the valgrind rig set up, I took the opportunity to plug a 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. --- diff --git a/src/FDM/YASim/Airplane.cpp b/src/FDM/YASim/Airplane.cpp index e9763673e..4f49c9216 100644 --- a/src/FDM/YASim/Airplane.cpp +++ b/src/FDM/YASim/Airplane.cpp @@ -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); diff --git a/src/FDM/YASim/Airplane.hpp b/src/FDM/YASim/Airplane.hpp index 8c46c46f5..762ff33fd 100644 --- a/src/FDM/YASim/Airplane.hpp +++ b/src/FDM/YASim/Airplane.hpp @@ -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(); diff --git a/src/FDM/YASim/FGFDM.cpp b/src/FDM/YASim/FGFDM.cpp index b72e7fa55..426a35ed4 100644 --- a/src/FDM/YASim/FGFDM.cpp +++ b/src/FDM/YASim/FGFDM.cpp @@ -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) diff --git a/src/FDM/YASim/Vector.hpp b/src/FDM/YASim/Vector.hpp index db8c8c719..ea647a30d 100644 --- a/src/FDM/YASim/Vector.hpp +++ b/src/FDM/YASim/Vector.hpp @@ -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) diff --git a/src/FDM/YASim/yasim-test.cpp b/src/FDM/YASim/yasim-test.cpp index 7f578b6a9..d00a564bb 100644 --- a/src/FDM/YASim/yasim-test.cpp +++ b/src/FDM/YASim/yasim-test.cpp @@ -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; }