only use over-aligned new/delete if needed
diff --git a/.appveyor.yml b/.appveyor.yml index 5e96940..3d49d56 100644 --- a/.appveyor.yml +++ b/.appveyor.yml
@@ -3,6 +3,7 @@ - Visual Studio 2017 - Visual Studio 2015 test: off +skip_branch_with_pr: true build: parallel: true platform:
diff --git a/include/pybind11/cast.h b/include/pybind11/cast.h index ff15a41..a7b3e3f 100644 --- a/include/pybind11/cast.h +++ b/include/pybind11/cast.h
@@ -574,12 +574,13 @@ if (type->operator_new) { vptr = type->operator_new(type->type_size); } else { - #if !defined(PYBIND11_CPP17) - vptr = ::operator new(type->type_size); - #else - vptr = ::operator new(type->type_size, - (std::align_val_t) type->type_align); + #if defined(PYBIND11_CPP17) + if (type->type_align > __STDCPP_DEFAULT_NEW_ALIGNMENT__) + vptr = ::operator new(type->type_size, + (std::align_val_t) type->type_align); + else #endif + vptr = ::operator new(type->type_size); } } value = vptr;
diff --git a/include/pybind11/pybind11.h b/include/pybind11/pybind11.h index 9dd71e4..860d1b1 100644 --- a/include/pybind11/pybind11.h +++ b/include/pybind11/pybind11.h
@@ -988,11 +988,21 @@ : std::true_type { }; /// Call class-specific delete if it exists or global otherwise. Can also be an overload set. template <typename T, enable_if_t<has_operator_delete<T>::value, int> = 0> -void call_operator_delete(T *p, size_t) { T::operator delete(p); } +void call_operator_delete(T *p, size_t, size_t) { T::operator delete(p); } template <typename T, enable_if_t<!has_operator_delete<T>::value && has_operator_delete_size<T>::value, int> = 0> -void call_operator_delete(T *p, size_t s) { T::operator delete(p, s); } +void call_operator_delete(T *p, size_t s, size_t) { T::operator delete(p, s); } -inline void call_operator_delete(void *p, size_t) { ::operator delete(p); } +inline void call_operator_delete(void *p, size_t s, size_t a) { + (void)s; (void)a; +#if defined(PYBIND11_CPP17) + if (a > __STDCPP_DEFAULT_NEW_ALIGNMENT__) + ::operator delete(p, s, std::align_val_t(a)); + else + ::operator delete(p, s); +#else + ::operator delete(p); +#endif +} NAMESPACE_END(detail) @@ -1331,7 +1341,10 @@ v_h.set_holder_constructed(false); } else { - detail::call_operator_delete(v_h.value_ptr<type>(), v_h.type->type_size); + detail::call_operator_delete(v_h.value_ptr<type>(), + v_h.type->type_size, + v_h.type->type_align + ); } v_h.value_ptr() = nullptr; }