From 9a7cc8b188c18bb302ff80dcf02ecf61257c05c6 Mon Sep 17 00:00:00 2001 From: Bertrand Coconnier Date: Sun, 9 Feb 2025 16:51:09 +0100 Subject: [PATCH] Fix a memory leak in `FGSwitch` --- src/models/flight_control/FGSwitch.cpp | 18 +++++++----------- src/models/flight_control/FGSwitch.h | 2 +- 2 files changed, 8 insertions(+), 12 deletions(-) diff --git a/src/models/flight_control/FGSwitch.cpp b/src/models/flight_control/FGSwitch.cpp index 380265a8b7..942a1936fa 100644 --- a/src/models/flight_control/FGSwitch.cpp +++ b/src/models/flight_control/FGSwitch.cpp @@ -77,7 +77,7 @@ CLASS IMPLEMENTATION FGSwitch::FGSwitch(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element) { string value; - Test *current_test; + unique_ptr current_test; auto PropertyManager = fcs->GetPropertyManager(); bind(element, PropertyManager.get()); // Bind() this component here in case it is used in its own @@ -85,7 +85,7 @@ FGSwitch::FGSwitch(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element) Element* test_element = element->FindElement("default"); if (test_element) { try { - current_test = new Test; + current_test = make_unique(); value = test_element->GetAttributeValue("value"); current_test->setTestValue(value, Name, PropertyManager, test_element); current_test->Default = true; @@ -95,7 +95,7 @@ FGSwitch::FGSwitch(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element) output_array[i] = v; // for the switch if that value is a number. } } - tests.push_back(current_test); + tests.push_back(current_test.release()); } catch (const BaseException& e) { FGXMLLogging log(fcs->GetExec()->GetLogger(), test_element, LogLevel::ERROR); log << e.what() << "\n" @@ -106,11 +106,11 @@ FGSwitch::FGSwitch(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element) test_element = element->FindElement("test"); while (test_element) { try { - current_test = new Test; - current_test->condition = new FGCondition(test_element, PropertyManager); + current_test = make_unique(); + current_test->condition = make_unique(test_element, PropertyManager); value = test_element->GetAttributeValue("value"); current_test->setTestValue(value, Name, PropertyManager, test_element); - tests.push_back(current_test); + tests.push_back(current_test.release()); } catch (const BaseException& e) { FGXMLLogging log(fcs->GetExec()->GetLogger(), test_element, LogLevel::ERROR); log << e.what() << "\n" @@ -127,11 +127,7 @@ FGSwitch::FGSwitch(FGFCS* fcs, Element* element) : FGFCSComponent(fcs, element) FGSwitch::~FGSwitch() { - for (auto test: tests) { - delete test->condition; - delete test; - } - + for (auto test: tests) delete test; Debug(1); } diff --git a/src/models/flight_control/FGSwitch.h b/src/models/flight_control/FGSwitch.h index a9c454e748..bca6d586aa 100644 --- a/src/models/flight_control/FGSwitch.h +++ b/src/models/flight_control/FGSwitch.h @@ -146,7 +146,7 @@ class FGSwitch : public FGFCSComponent private: struct Test { - FGCondition* condition; + std::unique_ptr condition; bool Default; FGParameter_ptr OutputValue;