From 97559bb1b2f6c916092d91d2255acfce6e2849a4 Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 8 Mar 2018 07:36:56 +0100 Subject: [PATCH 1/2] :hammer: trying to fix the leak Part 1: properly use forwarding --- include/nlohmann/detail/input/lexer.hpp | 2 +- include/nlohmann/json.hpp | 6 +++--- single_include/nlohmann/json.hpp | 8 ++++---- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/nlohmann/detail/input/lexer.hpp b/include/nlohmann/detail/input/lexer.hpp index 75001652..ea116093 100644 --- a/include/nlohmann/detail/input/lexer.hpp +++ b/include/nlohmann/detail/input/lexer.hpp @@ -1130,7 +1130,7 @@ scan_number_done: } /// return current string value (implicitly resets the token; useful only once) - std::string move_string() + std::string&& move_string() { return std::move(token_buffer); } diff --git a/include/nlohmann/json.hpp b/include/nlohmann/json.hpp index 91de782f..70f26747 100644 --- a/include/nlohmann/json.hpp +++ b/include/nlohmann/json.hpp @@ -953,7 +953,7 @@ class basic_json /// constructor for rvalue strings json_value(string_t&& value) { - string = create(std::move(value)); + string = create(std::forward < string_t&& > (value)); } /// constructor for objects @@ -965,7 +965,7 @@ class basic_json /// constructor for rvalue objects json_value(object_t&& value) { - object = create(std::move(value)); + object = create(std::forward < object_t&& > (value)); } /// constructor for arrays @@ -977,7 +977,7 @@ class basic_json /// constructor for rvalue arrays json_value(array_t&& value) { - array = create(std::move(value)); + array = create(std::forward < array_t&& > (value)); } void destroy(value_t t) noexcept diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index 5ef88282..afbfa076 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -2969,7 +2969,7 @@ scan_number_done: } /// return current string value (implicitly resets the token; useful only once) - std::string move_string() + std::string&& move_string() { return std::move(token_buffer); } @@ -10561,7 +10561,7 @@ class basic_json /// constructor for rvalue strings json_value(string_t&& value) { - string = create(std::move(value)); + string = create(std::forward < string_t&& > (value)); } /// constructor for objects @@ -10573,7 +10573,7 @@ class basic_json /// constructor for rvalue objects json_value(object_t&& value) { - object = create(std::move(value)); + object = create(std::forward < object_t&& > (value)); } /// constructor for arrays @@ -10585,7 +10585,7 @@ class basic_json /// constructor for rvalue arrays json_value(array_t&& value) { - array = create(std::move(value)); + array = create(std::forward < array_t&& > (value)); } void destroy(value_t t) noexcept From aa8fc2a41cec098c6f6de58f40bc7e8ff1fda16f Mon Sep 17 00:00:00 2001 From: Niels Lohmann Date: Thu, 8 Mar 2018 17:11:15 +0100 Subject: [PATCH 2/2] :ambulance: hopefully fixed the memory leak --- include/nlohmann/detail/input/parser.hpp | 1 + single_include/nlohmann/json.hpp | 1 + 2 files changed, 2 insertions(+) diff --git a/include/nlohmann/detail/input/parser.hpp b/include/nlohmann/detail/input/parser.hpp index 63e8541f..58d42bbe 100644 --- a/include/nlohmann/detail/input/parser.hpp +++ b/include/nlohmann/detail/input/parser.hpp @@ -403,6 +403,7 @@ class parser if (keep and callback and not callback(depth, parse_event_t::value, result)) { + result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; } } diff --git a/single_include/nlohmann/json.hpp b/single_include/nlohmann/json.hpp index afbfa076..8726ccd8 100644 --- a/single_include/nlohmann/json.hpp +++ b/single_include/nlohmann/json.hpp @@ -3526,6 +3526,7 @@ class parser if (keep and callback and not callback(depth, parse_event_t::value, result)) { + result.m_value.destroy(result.m_type); result.m_type = value_t::discarded; } }