diff --git a/tools/gn/loader.cc b/tools/gn/loader.cc
index 9061be8..3ac868c 100644
--- a/tools/gn/loader.cc
+++ b/tools/gn/loader.cc
@@ -7,7 +7,6 @@
 #include "base/bind.h"
 #include "base/memory/ptr_util.h"
 #include "base/message_loop/message_loop.h"
-#include "base/stl_util.h"
 #include "tools/gn/build_settings.h"
 #include "tools/gn/err.h"
 #include "tools/gn/filesystem_utils.h"
@@ -106,8 +105,6 @@
 }
 
 LoaderImpl::~LoaderImpl() {
-  STLDeleteContainerPairSecondPointers(toolchain_records_.begin(),
-                                       toolchain_records_.end());
 }
 
 void LoaderImpl::Load(const SourceFile& file,
@@ -120,13 +117,14 @@
     return;  // Already in set, so this file was already loaded or schedulerd.
 
   if (toolchain_records_.empty()) {
-    // Nothing loaded, need to load the default build config. The intial load
+    // Nothing loaded, need to load the default build config. The initial load
     // should not specify a toolchain.
     DCHECK(toolchain_name.is_null());
 
-    ToolchainRecord* record =
-        new ToolchainRecord(build_settings_, Label(), Label());
-    toolchain_records_[Label()] = record;
+    std::unique_ptr<ToolchainRecord> new_record(
+        new ToolchainRecord(build_settings_, Label(), Label()));
+    ToolchainRecord* record = new_record.get();
+    toolchain_records_[Label()] = std::move(new_record);
 
     // The default build config is no dependent on the toolchain definition,
     // since we need to load the build config before we know what the default
@@ -135,22 +133,24 @@
 
     record->waiting_on_me.push_back(SourceFileAndOrigin(file, origin));
     ScheduleLoadBuildConfig(&record->settings, Scope::KeyValueMap());
+
     return;
   }
 
   ToolchainRecord* record;
   if (toolchain_name.is_null())
-    record = toolchain_records_[default_toolchain_label_];
+    record = toolchain_records_[default_toolchain_label_].get();
   else
-    record = toolchain_records_[toolchain_name];
+    record = toolchain_records_[toolchain_name].get();
 
   if (!record) {
     DCHECK(!default_toolchain_label_.is_null());
 
     // No reference to this toolchain found yet, make one.
-    record = new ToolchainRecord(build_settings_, toolchain_name,
-                                 default_toolchain_label_);
-    toolchain_records_[toolchain_name] = record;
+    std::unique_ptr<ToolchainRecord> new_record(new ToolchainRecord(
+        build_settings_, toolchain_name, default_toolchain_label_));
+    record = new_record.get();
+    toolchain_records_[toolchain_name] = std::move(new_record);
 
     // Schedule a load of the toolchain using the default one.
     Load(BuildFileForLabel(toolchain_name), origin, default_toolchain_label_);
@@ -163,12 +163,13 @@
 }
 
 void LoaderImpl::ToolchainLoaded(const Toolchain* toolchain) {
-  ToolchainRecord* record = toolchain_records_[toolchain->label()];
+  ToolchainRecord* record = toolchain_records_[toolchain->label()].get();
   if (!record) {
     DCHECK(!default_toolchain_label_.is_null());
-    record = new ToolchainRecord(build_settings_, toolchain->label(),
-                                 default_toolchain_label_);
-    toolchain_records_[toolchain->label()] = record;
+    std::unique_ptr<ToolchainRecord> new_record(new ToolchainRecord(
+        build_settings_, toolchain->label(), default_toolchain_label_));
+    record = new_record.get();
+    toolchain_records_[toolchain->label()] = std::move(new_record);
   }
   record->is_toolchain_loaded = true;
 
@@ -356,8 +357,10 @@
     CHECK(empty_label != toolchain_records_.end());
 
     // Fix up the toolchain record.
-    record = empty_label->second;
-    toolchain_records_[label] = record;
+    std::unique_ptr<ToolchainRecord> moved_record =
+        std::move(empty_label->second);
+    record = moved_record.get();
+    toolchain_records_[label] = std::move(moved_record);
     toolchain_records_.erase(empty_label);
 
     // Save the default toolchain label.
@@ -383,7 +386,7 @@
       }
     }
   } else {
-    record = found_toolchain->second;
+    record = found_toolchain->second.get();
   }
 
   DCHECK(!record->is_config_loaded);
diff --git a/tools/gn/loader.h b/tools/gn/loader.h
index 3d61fe4..37f7085 100644
--- a/tools/gn/loader.h
+++ b/tools/gn/loader.h
@@ -6,6 +6,7 @@
 #define TOOLS_GN_LOADER_H_
 
 #include <map>
+#include <memory>
 #include <set>
 
 #include "base/callback.h"
@@ -173,8 +174,7 @@
   Label default_toolchain_label_;
 
   // Records for the build config file loads.
-  // Owning pointers.
-  typedef std::map<Label, ToolchainRecord*> ToolchainRecordMap;
+  typedef std::map<Label, std::unique_ptr<ToolchainRecord>> ToolchainRecordMap;
   ToolchainRecordMap toolchain_records_;
 };
 
