Merge pull request #232 from louisrubet/#225/mem_leak_due_to_perf_correction

#225 mem leak due to perf correction
This commit is contained in:
Louis Rubet 2022-02-22 17:25:46 +01:00 committed by GitHub
commit d25c8cefbc
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 15 additions and 8 deletions

View file

@ -6,7 +6,7 @@ project(rpn)
if((NOT CMAKE_BUILD_TYPE MATCHES Debug) if((NOT CMAKE_BUILD_TYPE MATCHES Debug)
AND (NOT CMAKE_BUILD_TYPE MATCHES Release)) AND (NOT CMAKE_BUILD_TYPE MATCHES Release))
set(CMAKE_BUILD_TYPE Release CACHE string "Choose the type of build, options are: None Debug Release" FORCE) set(CMAKE_BUILD_TYPE Release CACHE STRING "Choose the type of build, options are: None Debug Release" FORCE)
endif() endif()
message(STATUS "Build mode: ${CMAKE_BUILD_TYPE}") message(STATUS "Build mode: ${CMAKE_BUILD_TYPE}")

View file

@ -5,7 +5,7 @@ bool Lexer::lexer(string& entry, map<string, ReservedWord>& keywords, vector<Syn
size_t jump; size_t jump;
for (size_t i = 0; i < entry.size(); i++) { for (size_t i = 0; i < entry.size(); i++) {
if (isspace(entry[i])) continue; if (isspace(entry[i])) continue;
SynElement element; SynElement element{.re = nullptr, .im = nullptr};
switch (entry[i]) { switch (entry[i]) {
case '"': case '"':
if (!parseString(entry, i, jump, errors, elements)) return false; if (!parseString(entry, i, jump, errors, elements)) return false;
@ -116,8 +116,7 @@ int Lexer::getBaseAt(string& entry, size_t& nextIdx, bool& positive) {
if (entry[scan] == '+') { if (entry[scan] == '+') {
scan++; scan++;
nextIdx = scan; nextIdx = scan;
} } else if (entry[scan] == '-') {
else if (entry[scan] == '-') {
scan++; scan++;
nextIdx = scan; nextIdx = scan;
positive = false; positive = false;
@ -169,8 +168,10 @@ bool Lexer::getNumberAt(string& entry, size_t idx, size_t& nextIdx, int& base, m
if (mpfr_set_str((*r)->mpfr_ptr(), token.c_str(), base, mpreal::get_default_rnd()) == 0) { if (mpfr_set_str((*r)->mpfr_ptr(), token.c_str(), base, mpreal::get_default_rnd()) == 0) {
if (!positive) *(*r) = -*(*r); if (!positive) *(*r) = -*(*r);
return true; return true;
} else } else {
return false; delete *r;
return false;
}
} }
nextIdx = token.size() + idx + 1; nextIdx = token.size() + idx + 1;
return false; return false;
@ -206,16 +207,19 @@ bool Lexer::parseComplex(string& entry, size_t idx, size_t& nextIdx, vector<SynE
} }
size_t i = nextIdx; size_t i = nextIdx;
// while (i < entry.size() && entry[i] != ',') i++;
if (i >= entry.size()) { if (i >= entry.size()) {
elements.push_back({cmd_symbol, .value = entry.substr(idx, entry.size() - idx)}); elements.push_back({cmd_symbol, .value = entry.substr(idx, entry.size() - idx)});
nextIdx = entry.size(); nextIdx = entry.size();
if (re != nullptr) delete re;
if (im != nullptr) delete im;
return true; // complex format error, return a symbol return true; // complex format error, return a symbol
} }
if (!getNumberAt(entry, i, nextIdx, imBase, &im, ')')) { if (!getNumberAt(entry, i, nextIdx, imBase, &im, ')')) {
elements.push_back({cmd_symbol, .value = entry.substr(idx, entry.size() - idx)}); elements.push_back({cmd_symbol, .value = entry.substr(idx, entry.size() - idx)});
nextIdx = entry.size(); nextIdx = entry.size();
if (re != nullptr) delete re;
if (im != nullptr) delete im;
return true; // complex format error, return a symbol return true; // complex format error, return a symbol
} }
elements.push_back({cmd_complex, .re = re, .im = im, .reBase = reBase, .imBase = imBase}); elements.push_back({cmd_complex, .re = re, .im = im, .reBase = reBase, .imBase = imBase});

View file

@ -612,7 +612,10 @@ ret_value program::parse(string& entry) {
break; break;
default: default:
show_error(ret_unknown_err, "error creating program from entry"); show_error(ret_unknown_err, "error creating program from entry");
break;
} }
if (element.re != nullptr) delete element.re;
if (element.im != nullptr) delete element.im;
} }
} else } else
for (SynError& err : errors) show_syntax_error(err.err.c_str()); for (SynError& err : errors) show_syntax_error(err.err.c_str());

View file

@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
rpn=../build/rpn rpn=../debug/rpn
FG_RED="\033[0;31m" FG_RED="\033[0;31m"
FG_GREEN="\033[0;32m" FG_GREEN="\033[0;32m"