Base: Fix memory leak in Quantity::parse
If an exception is thrown then the allocated buffer won't be cleaned up. To make this exception-safe the class StringBufferCleaner is added using the RAII idiom
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user