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)
This commit is contained in:
Tomasz Sowa 2021-06-27 15:41:38 +02:00
parent 4a1630b1ea
commit 009e240a8d
2 changed files with 62 additions and 29 deletions

View File

@ -278,7 +278,7 @@ void Space::set_empty_table()
{ {
if( type == type_table ) if( type == type_table )
{ {
value.value_table.clear(); remove_value_table(true);
} }
else else
{ {
@ -290,7 +290,7 @@ void Space::set_empty_object()
{ {
if( type == type_object ) if( type == type_object )
{ {
value.value_object.clear(); remove_value_object(true);
} }
else else
{ {
@ -629,9 +629,16 @@ Space & Space::add(const wchar_t * field, const Space * space)
Space & Space::add(const wchar_t * field, Space && space) Space & Space::add(const wchar_t * field, Space && space)
{ {
initialize_value_object_if_needed(); initialize_value_object_if_needed();
auto insert_res = value.value_object.insert(std::make_pair(field, nullptr)); 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); 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_from(const Space & space)
void Space::copy_value_from(const Space & space)
{ {
switch(space.type) 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) void Space::copy_value_object(const Value & value_from)
{ {
initialize_value_object_if_needed(); if( type == type_object )
value.value_object.clear(); {
remove_value_object(true);
}
else
{
initialize_value_object_if_needed();
}
for(auto map_item : value_from.value_object) 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) void Space::copy_value_table(const Value & value_from)
{ {
initialize_value_table_if_needed(); if( type == type_table )
value.value_table.clear(); {
remove_value_table(true);
}
else
{
initialize_value_table_if_needed();
}
for(Space * space : value_from.value_table) for(Space * space : value_from.value_table)
{ {
@ -2194,7 +2205,7 @@ void Space::move_value_from(Space && space)
break; break;
default: default:
copy_value_from(space); copy_from(space);
break; break;
} }
} }
@ -2351,6 +2362,7 @@ void Space::initialize_value_object_if_needed(ObjectType && obj)
} }
else else
{ {
remove_value_object(true);
value.value_object = std::move(obj); value.value_object = std::move(obj);
} }
} }
@ -2377,6 +2389,7 @@ void Space::initialize_value_table_if_needed(TableType && tab)
} }
else else
{ {
remove_value_table(true);
value.value_table = std::move(tab); 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) for(auto map_item : value.value_object)
{ {
@ -2446,12 +2459,19 @@ void Space::remove_value_object()
map_item.second = nullptr; map_item.second = nullptr;
} }
value.value_object.~ObjectType(); if( only_clear )
type = type_null; {
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) 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[i] = nullptr;
} }
value.value_table.~TableType(); if( only_clear )
type = type_null; {
value.value_table.clear();
}
else
{
value.value_table.~TableType();
type = type_null;
}
} }

View File

@ -647,9 +647,16 @@ protected:
Space & add_generic(const wchar_t * field, const ArgType & val) Space & add_generic(const wchar_t * field, const ArgType & val)
{ {
initialize_value_object_if_needed(); initialize_value_object_if_needed();
auto insert_res = value.value_object.insert(std::make_pair(field, nullptr)); 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); 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_from(const Space & space);
void copy_value_object(const Value & value_from); void copy_value_object(const Value & value_from);
@ -1369,8 +1375,8 @@ protected:
void remove_value(); void remove_value();
void remove_value_string(); void remove_value_string();
void remove_value_wstring(); void remove_value_wstring();
void remove_value_object(); void remove_value_object(bool only_clear = false);
void remove_value_table(); void remove_value_table(bool only_clear = false);
}; };