From 5bbb9bbf0f84255f154caf909767243aaf165dd6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ion=20Gazta=C3=B1aga?= Date: Tue, 25 Dec 2012 23:07:01 +0000 Subject: [PATCH] Fixes #7830 [SVN r82206] --- include/boost/move/algorithm.hpp | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/include/boost/move/algorithm.hpp b/include/boost/move/algorithm.hpp index 5a0c25f..36a46be 100644 --- a/include/boost/move/algorithm.hpp +++ b/include/boost/move/algorithm.hpp @@ -19,6 +19,7 @@ #include #include #include +#include #include //copy, copy_backward #include //uninitialized_copy @@ -110,10 +111,22 @@ F uninitialized_move(I f, I l, F r ) { typedef typename std::iterator_traits::value_type input_value_type; - while (f != l) { - ::new(static_cast(&*r)) input_value_type(boost::move(*f)); - ++f; ++r; + + F back = r; + BOOST_TRY{ + while (f != l) { + void * const addr = static_cast(::boost::move_detail::addressof(*r)); + ::new(addr) input_value_type(::boost::move(*f)); + ++f; ++r; + } } + BOOST_CATCH(...){ + for (; back != r; ++back){ + back->~input_value_type(); + } + BOOST_RETHROW; + } + BOOST_CATCH_END return r; }