GN: Fix a memory leak found by LSAN.

Change-Id: I27d42d74889d455ac162c5701868fb5f2e837261
Reviewed-on: https://chromium-review.googlesource.com/885863
Reviewed-by: Dirk Pranke <dpranke@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Cr-Original-Commit-Position: refs/heads/master@{#532183}
Cr-Mirrored-From: https://chromium.googlesource.com/chromium/src
Cr-Mirrored-Commit: 31360b70f47bcc18df1501ed665793b693469f34
diff --git a/tools/gn/builder.cc b/tools/gn/builder.cc
index 4b464af..ec45e6c 100644
--- a/tools/gn/builder.cc
+++ b/tools/gn/builder.cc
@@ -134,7 +134,7 @@
   std::vector<const BuilderRecord*> result;
   result.reserve(records_.size());
   for (const auto& record : records_)
-    result.push_back(record.second);
+    result.push_back(record.second.get());
   return result;
 }
 
@@ -168,10 +168,8 @@
 }
 
 BuilderRecord* Builder::GetRecord(const Label& label) {
-  RecordMap::iterator found = records_.find(label);
-  if (found == records_.end())
-    return nullptr;
-  return found->second;
+  auto found = records_.find(label);
+  return (found != records_.end()) ? found->second.get() : nullptr;
 }
 
 bool Builder::CheckForBadItems(Err* err) const {
@@ -187,7 +185,7 @@
   std::vector<const BuilderRecord*> bad_records;
   std::string depstring;
   for (const auto& record_pair : records_) {
-    const BuilderRecord* src = record_pair.second;
+    const BuilderRecord* src = record_pair.second.get();
     if (!src->should_generate())
       continue;  // Skip ungenerated nodes.
 
@@ -308,9 +306,10 @@
   BuilderRecord* record = GetRecord(label);
   if (!record) {
     // Not seen this record yet, create a new one.
-    record = new BuilderRecord(type, label);
-    record->set_originally_referenced_from(request_from);
-    records_[label] = record;
+    auto new_record = std::make_unique<BuilderRecord>(type, label);
+    new_record->set_originally_referenced_from(request_from);
+    record = new_record.get();
+    records_[label] = std::move(new_record);
     return record;
   }
 
diff --git a/tools/gn/builder.h b/tools/gn/builder.h
index 27a1fb3..58ccbad 100644
--- a/tools/gn/builder.h
+++ b/tools/gn/builder.h
@@ -6,6 +6,7 @@
 #define TOOLS_GN_BUILDER_H_
 
 #include <map>
+#include <memory>
 
 #include "base/callback.h"
 #include "base/macros.h"
@@ -137,9 +138,7 @@
   // Non owning pointer.
   Loader* loader_;
 
-  // Owning pointers.
-  typedef std::map<Label, BuilderRecord*> RecordMap;
-  RecordMap records_;
+  std::map<Label, std::unique_ptr<BuilderRecord>> records_;
 
   ResolvedGeneratedCallback resolved_and_generated_callback_;