From 009e240a8dd0f935b7e04ee57a35c3684bc92831 Mon Sep 17 00:00:00 2001 From: Tomasz Sowa Date: Sun, 27 Jun 2021 15:41:38 +0200 Subject: [PATCH] fixed some memory leaks in Space, pointers in tables and objects were not correctly 'deleted', affected methods: set_empty_table() set_empty_object() add(const wchar_t * field, Space && space) copy_value_object(const Value & value_from) copy_value_table(const Value & value_from) initialize_value_object_if_needed(ObjectType && obj) initialize_value_table_if_needed(TableType && tab) add_generic(const wchar_t * field, const ArgType & val) --- src/space/space.cpp | 75 ++++++++++++++++++++++++++++++--------------- src/space/space.h | 16 +++++++--- 2 files changed, 62 insertions(+), 29 deletions(-) diff --git a/src/space/space.cpp b/src/space/space.cpp index 21eed21..4c21f96 100644 --- a/src/space/space.cpp +++ b/src/space/space.cpp @@ -278,7 +278,7 @@ void Space::set_empty_table() { if( type == type_table ) { - value.value_table.clear(); + remove_value_table(true); } else { @@ -290,7 +290,7 @@ void Space::set_empty_object() { if( type == type_object ) { - value.value_object.clear(); + remove_value_object(true); } else { @@ -629,9 +629,16 @@ Space & Space::add(const wchar_t * field, const Space * space) Space & Space::add(const wchar_t * field, Space && space) { initialize_value_object_if_needed(); - auto insert_res = value.value_object.insert(std::make_pair(field, nullptr)); - insert_res.first->second = new Space(std::move(space)); + + if( insert_res.second ) + { + insert_res.first->second = new Space(std::move(space)); + } + else + { + insert_res.first->second->set(std::move(space)); + } return *(insert_res.first->second); } @@ -2082,8 +2089,7 @@ bool Space::has_value(const wchar_t * field, const std::wstring & val) const - -void Space::copy_value_from(const Space & space) +void Space::copy_from(const Space & space) { switch(space.type) { @@ -2138,19 +2144,18 @@ void Space::copy_value_from(const Space & space) -void Space::copy_from(const Space & space) -{ - copy_value_from(space); -} - - - void Space::copy_value_object(const Value & value_from) { - initialize_value_object_if_needed(); - value.value_object.clear(); + if( type == type_object ) + { + remove_value_object(true); + } + else + { + initialize_value_object_if_needed(); + } for(auto map_item : value_from.value_object) { @@ -2162,8 +2167,14 @@ void Space::copy_value_object(const Value & value_from) void Space::copy_value_table(const Value & value_from) { - initialize_value_table_if_needed(); - value.value_table.clear(); + if( type == type_table ) + { + remove_value_table(true); + } + else + { + initialize_value_table_if_needed(); + } for(Space * space : value_from.value_table) { @@ -2194,7 +2205,7 @@ void Space::move_value_from(Space && space) break; default: - copy_value_from(space); + copy_from(space); break; } } @@ -2351,6 +2362,7 @@ void Space::initialize_value_object_if_needed(ObjectType && obj) } else { + remove_value_object(true); value.value_object = std::move(obj); } } @@ -2377,6 +2389,7 @@ void Space::initialize_value_table_if_needed(TableType && tab) } else { + remove_value_table(true); value.value_table = std::move(tab); } } @@ -2438,7 +2451,7 @@ void Space::remove_value_wstring() } -void Space::remove_value_object() +void Space::remove_value_object(bool only_clear) { for(auto map_item : value.value_object) { @@ -2446,12 +2459,19 @@ void Space::remove_value_object() map_item.second = nullptr; } - value.value_object.~ObjectType(); - type = type_null; + if( only_clear ) + { + value.value_object.clear(); + } + else + { + value.value_object.~ObjectType(); + type = type_null; + } } -void Space::remove_value_table() +void Space::remove_value_table(bool only_clear) { for(size_t i = 0 ; i < value.value_table.size() ; ++i) { @@ -2459,8 +2479,15 @@ void Space::remove_value_table() value.value_table[i] = nullptr; } - value.value_table.~TableType(); - type = type_null; + if( only_clear ) + { + value.value_table.clear(); + } + else + { + value.value_table.~TableType(); + type = type_null; + } } diff --git a/src/space/space.h b/src/space/space.h index 740e964..0561370 100644 --- a/src/space/space.h +++ b/src/space/space.h @@ -647,9 +647,16 @@ protected: Space & add_generic(const wchar_t * field, const ArgType & val) { initialize_value_object_if_needed(); - auto insert_res = value.value_object.insert(std::make_pair(field, nullptr)); - insert_res.first->second = new Space(val); + + if( insert_res.second ) + { + insert_res.first->second = new Space(val); + } + else + { + insert_res.first->second->set(val); + } return *(insert_res.first->second); } @@ -1341,7 +1348,6 @@ protected: } - void copy_value_from(const Space & space); void copy_from(const Space & space); void copy_value_object(const Value & value_from); @@ -1369,8 +1375,8 @@ protected: void remove_value(); void remove_value_string(); void remove_value_wstring(); - void remove_value_object(); - void remove_value_table(); + void remove_value_object(bool only_clear = false); + void remove_value_table(bool only_clear = false); };