Fix issue where compiler cannot determine address of ::free at compile time
authorCameron Pickett <pickett@fb.com>
Fri, 21 Apr 2017 01:33:05 +0000 (18:33 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Fri, 21 Apr 2017 01:35:06 +0000 (18:35 -0700)
Reviewed By: Orvid

Differential Revision: D4921738

fbshipit-source-id: 69848cda3638fca4ead73dcc9949af0f600f33bb

folly/Memory.h

index d24422190250cf4bdf7c05426a185f9d159ca4e5..272d64dc68da5b6e997f6acb49e92be5d0d0a4b2 100644 (file)
@@ -137,7 +137,18 @@ std::weak_ptr<T> to_weak_ptr(const std::shared_ptr<T>& ptr) {
   return std::weak_ptr<T>(ptr);
 }
 
-using SysBufferDeleter = static_function_deleter<void, ::free>;
+namespace detail {
+/**
+ * Not all STL implementations define ::free in a way that its address can be
+ * determined at compile time. So we must wrap ::free in a function whose
+ * address can be determined.
+ */
+inline void SysFree(void* p) {
+  ::free(p);
+}
+}
+
+using SysBufferDeleter = static_function_deleter<void, &detail::SysFree>;
 using SysBufferUniquePtr = std::unique_ptr<void, SysBufferDeleter>;
 inline SysBufferUniquePtr allocate_sys_buffer(size_t size) {
   return SysBufferUniquePtr(::malloc(size));