From 97559bb1b2f6c916092d91d2255acfce6e2849a4 Mon Sep 17 00:00:00 2001
From: Niels Lohmann <mail@nlohmann.me>
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<string_t>(std::move(value));
+            string = create<string_t>(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<object_t>(std::move(value));
+            object = create<object_t>(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<array_t>(std::move(value));
+            array = create<array_t>(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<string_t>(std::move(value));
+            string = create<string_t>(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<object_t>(std::move(value));
+            object = create<object_t>(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<array_t>(std::move(value));
+            array = create<array_t>(std::forward < array_t&& > (value));
         }
 
         void destroy(value_t t) noexcept

From aa8fc2a41cec098c6f6de58f40bc7e8ff1fda16f Mon Sep 17 00:00:00 2001
From: Niels Lohmann <mail@nlohmann.me>
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;
         }
     }