diff options
author | Stephan Bergmann <sbergman@redhat.com> | 2013-02-14 15:21:46 +0100 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2013-02-14 15:55:09 +0100 |
commit | c91d353872b7d4e1a39192bff1444b46cab6e5eb (patch) | |
tree | fd3990e4c21fdb283c9208d294a2c4e7cdc99642 /sal/inc | |
parent | bc96a84370fb167ab2c63582c10535992f31768c (diff) |
rhbz#908674: Adapt rtl::Allocator::construct to C++11
...otherwise, at least with some --with-system-boost versions and C++11
compilers, like with Fedora's boost-1.50.0-4.fc18.x86_64 and
gcc-c++-4.7.2-8.fc18.x86_64, using this to copy-construct an instance of
boost::unordered::detail::ptr_node<std::pair<rtl::OUString,Bootstrap_Impl*>> in
the call to p_bootstrap_map->insert(...) in rtl_bootstrap_args_open
(sal/rtl/source/bootstrap.cxx) would memcopy the ptr_node and fail to call
rtl_uString_acquire, leading to memory corruption later on when
rtl_uString_release is called one time too often.
It is not entirely clear to me whether this is a shortcoming of the given Boost
version, but this patch solves the problem and brings rtl::Allocator::construct
in line with the (changed) Allocator requirements of C++11 anyway.
The problem potentially lurks with every use of rtl::Allocator, but only showed
now begining with LO 4.0 where e5111574fd904b38a3980ca4ea3d21cfcb22dea6 "Revert
'sb140: sb140: #i116981# clean up memory upon exit'" re-introduced code into
rtl_bootstrap_args_open that inserts into a boost::unordered_map that uses
rtl::Allocator.
Change-Id: I3be22f59a8eb49d31458480c27f3ce15803c7fd4
Diffstat (limited to 'sal/inc')
-rw-r--r-- | sal/inc/rtl/allocator.hxx | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/sal/inc/rtl/allocator.hxx b/sal/inc/rtl/allocator.hxx index 4900d979a906..a70abffe2eb7 100644 --- a/sal/inc/rtl/allocator.hxx +++ b/sal/inc/rtl/allocator.hxx @@ -23,6 +23,10 @@ #include "rtl/alloc.h" #include <cstddef> +#if defined LIBO_INTERNAL_ONLY +#include "config_global.h" +#endif + /// @cond INTERNAL //###################################################### @@ -125,10 +129,18 @@ public: } //----------------------------------------- +#if defined HAVE_CXX11_PERFECT_FORWARDING + template< typename... Args > + void construct (pointer p, Args &&... value) + { + new ((void*)p)T(std::forward< Args >(value)...); + } +#else void construct (pointer p, const T& value) { new ((void*)p)T(value); } +#endif //----------------------------------------- void destroy (pointer p) |