diff --git a/src/Base/Quantity.cpp b/src/Base/Quantity.cpp index 7de1e7c49b..fe4c0e1e95 100644 --- a/src/Base/Quantity.cpp +++ b/src/Base/Quantity.cpp @@ -532,6 +532,28 @@ int QuantityLexer(); // NOLINTNEXTLINE #include "QuantityLexer.c" #endif // DOXYGEN_SHOULD_SKIP_THIS + +class StringBufferCleaner +{ +public: + explicit StringBufferCleaner(YY_BUFFER_STATE buffer) + : my_string_buffer {buffer} + {} + ~StringBufferCleaner() + { + // free the scan buffer + yy_delete_buffer(my_string_buffer); + } + + StringBufferCleaner(const StringBufferCleaner&) = delete; + StringBufferCleaner(StringBufferCleaner&&) = delete; + StringBufferCleaner& operator=(const StringBufferCleaner&) = delete; + StringBufferCleaner& operator=(StringBufferCleaner&&) = delete; + +private: + YY_BUFFER_STATE my_string_buffer; +}; + } // namespace QuantityParser #if defined(__clang__) @@ -545,12 +567,11 @@ Quantity Quantity::parse(const QString& string) // parse from buffer QuantityParser::YY_BUFFER_STATE my_string_buffer = QuantityParser::yy_scan_string(string.toUtf8().data()); + QuantityParser::StringBufferCleaner cleaner(my_string_buffer); // set the global return variables QuantResult = Quantity(DOUBLE_MIN); // run the parser QuantityParser::yyparse(); - // free the scan buffer - QuantityParser::yy_delete_buffer(my_string_buffer); return QuantResult; }