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
[email protected]
http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits