diff options
Diffstat (limited to 'tools/aapt2/java/ClassDefinition.cpp')
-rw-r--r-- | tools/aapt2/java/ClassDefinition.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/tools/aapt2/java/ClassDefinition.cpp b/tools/aapt2/java/ClassDefinition.cpp index b692ccf7e52d..f5f5b05491bb 100644 --- a/tools/aapt2/java/ClassDefinition.cpp +++ b/tools/aapt2/java/ClassDefinition.cpp @@ -45,8 +45,18 @@ ClassDefinition::Result ClassDefinition::AddMember(std::unique_ptr<ClassMember> Result result = Result::kAdded; auto iter = indexed_members_.find(member->GetName()); if (iter != indexed_members_.end()) { - // Overwrite the entry. - ordered_members_[iter->second].reset(); + // Overwrite the entry. Be careful, as the key in indexed_members_ is actually memory owned + // by the value at ordered_members_[index]. Since overwriting a value for a key doesn't replace + // the key (the initial key inserted into the unordered_map is kept), we must erase and then + // insert a new key, whose memory is being kept around. We do all this to avoid using more + // memory for each key. + size_t index = iter->second; + + // Erase the key + value from the map. + indexed_members_.erase(iter); + + // Now clear the memory that was backing the key (now erased). + ordered_members_[index].reset(); result = Result::kOverridden; } |