Fix memory leak in Json move assignment operator

*  When move assignment is creates a cyclic ownership pattern
   memory was being leaked.  This patch breaks the cycle.

*  Fixes: #2572
This commit is contained in:
Howard Hinnant
2018-11-01 16:17:11 -04:00
committed by Nik Bougalis
parent 156e8dae83
commit 157c066f2b
3 changed files with 20 additions and 7 deletions

View File

@@ -348,10 +348,10 @@ Value::~Value ()
}
Value&
Value::operator= ( const Value& other )
Value::operator=(Value const& other)
{
Value temp ( other );
swap ( temp );
Value tmp(other);
swap(tmp);
return *this;
}
@@ -365,9 +365,10 @@ Value::Value ( Value&& other ) noexcept
}
Value&
Value::operator= ( Value&& other ) noexcept
Value::operator=(Value&& other)
{
swap ( other );
Value tmp(std::move(other));
swap(tmp);
return *this;
}

View File

@@ -233,10 +233,10 @@ public:
Value ( const Value& other );
~Value ();
Value& operator= ( const Value& other );
Value& operator= ( Value const& other );
Value& operator= ( Value&& other );
Value ( Value&& other ) noexcept;
Value& operator= ( Value&& other ) noexcept;
/// Swap values.
/// \note Currently, comments are intentionally not swapped, for

View File

@@ -296,6 +296,17 @@ struct json_value_test : beast::unit_test::suite
}
}
void
test_leak()
{
// When run with the address sanitizer, this test confirms there is no
// memory leak with the scenario below.
Json::Value a;
a[0u] = 1;
a = std::move(a[0u]);
pass();
}
void run () override
{
test_bool ();
@@ -306,6 +317,7 @@ struct json_value_test : beast::unit_test::suite
test_comparisons ();
test_compact ();
test_nest_limits ();
test_leak();
}
};