Commit 31360b70 authored by Lei Zhang's avatar Lei Zhang Committed by Commit Bot

GN: Fix a memory leak found by LSAN.

Change-Id: I27d42d74889d455ac162c5701868fb5f2e837261
Reviewed-on: https://chromium-review.googlesource.com/885863Reviewed-by: default avatarDirk Pranke <dpranke@chromium.org>
Commit-Queue: Lei Zhang <thestig@chromium.org>
Cr-Commit-Position: refs/heads/master@{#532183}
parent c743eb59
...@@ -134,7 +134,7 @@ std::vector<const BuilderRecord*> Builder::GetAllRecords() const { ...@@ -134,7 +134,7 @@ std::vector<const BuilderRecord*> Builder::GetAllRecords() const {
std::vector<const BuilderRecord*> result; std::vector<const BuilderRecord*> result;
result.reserve(records_.size()); result.reserve(records_.size());
for (const auto& record : records_) for (const auto& record : records_)
result.push_back(record.second); result.push_back(record.second.get());
return result; return result;
} }
...@@ -168,10 +168,8 @@ const BuilderRecord* Builder::GetRecord(const Label& label) const { ...@@ -168,10 +168,8 @@ const BuilderRecord* Builder::GetRecord(const Label& label) const {
} }
BuilderRecord* Builder::GetRecord(const Label& label) { BuilderRecord* Builder::GetRecord(const Label& label) {
RecordMap::iterator found = records_.find(label); auto found = records_.find(label);
if (found == records_.end()) return (found != records_.end()) ? found->second.get() : nullptr;
return nullptr;
return found->second;
} }
bool Builder::CheckForBadItems(Err* err) const { bool Builder::CheckForBadItems(Err* err) const {
...@@ -187,7 +185,7 @@ bool Builder::CheckForBadItems(Err* err) const { ...@@ -187,7 +185,7 @@ bool Builder::CheckForBadItems(Err* err) const {
std::vector<const BuilderRecord*> bad_records; std::vector<const BuilderRecord*> bad_records;
std::string depstring; std::string depstring;
for (const auto& record_pair : records_) { for (const auto& record_pair : records_) {
const BuilderRecord* src = record_pair.second; const BuilderRecord* src = record_pair.second.get();
if (!src->should_generate()) if (!src->should_generate())
continue; // Skip ungenerated nodes. continue; // Skip ungenerated nodes.
...@@ -308,9 +306,10 @@ BuilderRecord* Builder::GetOrCreateRecordOfType(const Label& label, ...@@ -308,9 +306,10 @@ BuilderRecord* Builder::GetOrCreateRecordOfType(const Label& label,
BuilderRecord* record = GetRecord(label); BuilderRecord* record = GetRecord(label);
if (!record) { if (!record) {
// Not seen this record yet, create a new one. // Not seen this record yet, create a new one.
record = new BuilderRecord(type, label); auto new_record = std::make_unique<BuilderRecord>(type, label);
record->set_originally_referenced_from(request_from); new_record->set_originally_referenced_from(request_from);
records_[label] = record; record = new_record.get();
records_[label] = std::move(new_record);
return record; return record;
} }
......
...@@ -6,6 +6,7 @@ ...@@ -6,6 +6,7 @@
#define TOOLS_GN_BUILDER_H_ #define TOOLS_GN_BUILDER_H_
#include <map> #include <map>
#include <memory>
#include "base/callback.h" #include "base/callback.h"
#include "base/macros.h" #include "base/macros.h"
...@@ -137,9 +138,7 @@ class Builder { ...@@ -137,9 +138,7 @@ class Builder {
// Non owning pointer. // Non owning pointer.
Loader* loader_; Loader* loader_;
// Owning pointers. std::map<Label, std::unique_ptr<BuilderRecord>> records_;
typedef std::map<Label, BuilderRecord*> RecordMap;
RecordMap records_;
ResolvedGeneratedCallback resolved_and_generated_callback_; ResolvedGeneratedCallback resolved_and_generated_callback_;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment