libafw: Use std::free explicitly for overlays

Currently we rely on libc to call std::free on the malloced pointer to
the overlay table entry. Rather than relying on the libc implementation
to call std::free instead of trying to delete the pointer as if it was
created using "new", explicitly pass std::free as the deleter to the
data held by the std::shared_ptr.

Bug: 159562360
Test: Observed no heap growth while looping infinitely and retrieving
      a string resource overlaid using an inline xml value
Change-Id: I9a2ebaf9a993ad9c44fab8f052430c8142d4347d
diff --git a/libs/androidfw/Idmap.cpp b/libs/androidfw/Idmap.cpp
index eb6ee95..5f231ff 100644
--- a/libs/androidfw/Idmap.cpp
+++ b/libs/androidfw/Idmap.cpp
@@ -157,7 +157,7 @@
   table_value->dataType = entry->type;
   table_value->data = entry->value;
 
-  return Result(ResTable_entry_handle::managed(table_entry));
+  return Result(ResTable_entry_handle::managed(table_entry, [](auto p) { free(p); }));
 }
 
 static bool is_word_aligned(const void* data) {
diff --git a/libs/androidfw/include/androidfw/ResourceTypes.h b/libs/androidfw/include/androidfw/ResourceTypes.h
index 21be81c..e351a46 100644
--- a/libs/androidfw/include/androidfw/ResourceTypes.h
+++ b/libs/androidfw/include/androidfw/ResourceTypes.h
@@ -1601,8 +1601,8 @@
       entry_ = handle.entry_;
     }
 
-    inline static ResTable_entry_handle managed(ResTable_entry* entry)  {
-      return ResTable_entry_handle(std::shared_ptr<const ResTable_entry>(entry));
+    inline static ResTable_entry_handle managed(ResTable_entry* entry, void (*deleter)(void *)) {
+      return ResTable_entry_handle(std::shared_ptr<const ResTable_entry>(entry, deleter));
     }
 
     inline static ResTable_entry_handle unmanaged(const ResTable_entry* entry)  {