Remove memory leak in lmdb.cc while passing data from MDB_val to VariableValue

- add new VariableValue constructors for rvalue strings
 - decrease number of memory copies between lmdb and VariableValue
This commit is contained in:
Tomasz Ziolkowski 2021-02-24 12:38:25 +01:00 committed by Felipe Zimmerle
parent 3bfe4b81af
commit a4798f7f56
2 changed files with 22 additions and 6 deletions

View File

@ -47,6 +47,13 @@ class VariableValue {
m_value(value != nullptr?*value:"")
{ }
VariableValue(std::string&& key,
std::string&& value)
: m_collection(""),
m_key(std::move(key)),
m_value(std::move(value))
{ m_keyWithCollection = m_key; }
VariableValue(const std::string *collection,
const std::string *key,
const std::string *value)
@ -56,6 +63,14 @@ class VariableValue {
m_value(*value)
{ }
VariableValue(const std::string *collection,
std::string&& key,
std::string&& value)
: m_collection(*collection),
m_key(std::move(key)),
m_value(std::move(value))
{ m_keyWithCollection = m_collection + ":" + m_key; }
explicit VariableValue(const VariableValue *o) :
m_collection(o->m_collection),
m_key(o->m_key),

View File

@ -291,6 +291,7 @@ void LMDB::resolveSingleMatch(const std::string& var,
reinterpret_cast<char *>(mdb_value_ret.mv_data),
mdb_value_ret.mv_size);
VariableValue *v = new VariableValue(&var, a);
delete a;
l->push_back(v);
}
@ -498,9 +499,9 @@ void LMDB::resolveMultiMatches(const std::string& var,
while ((rc = mdb_cursor_get(cursor, &key, &data, MDB_NEXT)) == 0) {
l->insert(l->begin(), new VariableValue(
&m_name,
new std::string(reinterpret_cast<char *>(key.mv_data),
std::string(reinterpret_cast<char *>(key.mv_data),
key.mv_size),
new std::string(reinterpret_cast<char *>(data.mv_data),
std::string(reinterpret_cast<char *>(data.mv_data),
data.mv_size)));
}
} else {
@ -509,9 +510,9 @@ void LMDB::resolveMultiMatches(const std::string& var,
if (strncmp(var.c_str(), a, keySize) == 0) {
l->insert(l->begin(), new VariableValue(
&m_name,
new std::string(reinterpret_cast<char *>(key.mv_data),
std::string(reinterpret_cast<char *>(key.mv_data),
key.mv_size),
new std::string(reinterpret_cast<char *>(data.mv_data),
std::string(reinterpret_cast<char *>(data.mv_data),
data.mv_size)));
}
}
@ -569,9 +570,9 @@ void LMDB::resolveRegularExpression(const std::string& var,
}
VariableValue *v = new VariableValue(
new std::string(reinterpret_cast<char *>(key.mv_data),
std::string(reinterpret_cast<char *>(key.mv_data),
key.mv_size),
new std::string(reinterpret_cast<char *>(data.mv_data),
std::string(reinterpret_cast<char *>(data.mv_data),
data.mv_size));
l->insert(l->begin(), v);
}