mclow.lists created this revision.
mclow.lists added reviewers: EricWF, STL_MSFT.
mclow.lists added a subscriber: cfe-commits.

There's a bug in the standard, where the default deleter will always call 
`delete x`; even if `x` is an array type.  This shows up for `shared_ptr<T[]>`.

Do the right thing, and delete the array when you have one.


http://reviews.llvm.org/D21320

Files:
  include/memory

Index: include/memory
===================================================================
--- include/memory
+++ include/memory
@@ -2533,11 +2533,16 @@
     template <class _Up>
         _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up>&,
              typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0) 
_NOEXCEPT {}
-    _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT
+
+    _LIBCPP_INLINE_VISIBILITY void
+    operator() (_Tp* __ptr) const _NOEXCEPT
         {
             static_assert(sizeof(_Tp) > 0, "default_delete can not delete 
incomplete type");
             static_assert(!is_void<_Tp>::value, "default_delete can not delete 
incomplete type");
-            delete __ptr;
+            if ( is_array<_Tp>::value )
+                delete [] __ptr;
+            else
+                delete __ptr;
         }
 };
 


Index: include/memory
===================================================================
--- include/memory
+++ include/memory
@@ -2533,11 +2533,16 @@
     template <class _Up>
         _LIBCPP_INLINE_VISIBILITY default_delete(const default_delete<_Up>&,
              typename enable_if<is_convertible<_Up*, _Tp*>::value>::type* = 0) _NOEXCEPT {}
-    _LIBCPP_INLINE_VISIBILITY void operator() (_Tp* __ptr) const _NOEXCEPT
+
+    _LIBCPP_INLINE_VISIBILITY void
+    operator() (_Tp* __ptr) const _NOEXCEPT
         {
             static_assert(sizeof(_Tp) > 0, "default_delete can not delete incomplete type");
             static_assert(!is_void<_Tp>::value, "default_delete can not delete incomplete type");
-            delete __ptr;
+            if ( is_array<_Tp>::value )
+                delete [] __ptr;
+            else
+                delete __ptr;
         }
 };
 
_______________________________________________
cfe-commits mailing list
cfe-commits@lists.llvm.org
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to