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