From 3c2eac62c3574440b355337a219d0a9fceca2e6d Mon Sep 17 00:00:00 2001 From: Marshall Clow Date: Mon, 21 Jul 2014 15:11:13 +0000 Subject: [PATCH] In response to bug #20362, change the order of operations in vector move assignment so that if the allocator move assignment throws, we aren't left with two objects pointing at the same memory. This is not a complete fix; I am unconvinced that a complete fix is possible. With this change in place, we will leak the old contents of the vector. LWG issue #2106, when adopted, will make this problem illegal. Thanks to Thomas Koeppe for the report and analysis. git-svn-id: https://llvm.org/svn/llvm-project/libcxx/trunk@213546 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/vector | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/vector b/include/vector index 2cc23e5c6..d370214a4 100644 --- a/include/vector +++ b/include/vector @@ -1331,10 +1331,10 @@ vector<_Tp, _Allocator>::__move_assign(vector& __c, true_type) _NOEXCEPT_(is_nothrow_move_assignable::value) { deallocate(); + __base::__move_assign_alloc(__c); // this can throw this->__begin_ = __c.__begin_; this->__end_ = __c.__end_; this->__end_cap() = __c.__end_cap(); - __base::__move_assign_alloc(__c); __c.__begin_ = __c.__end_ = __c.__end_cap() = nullptr; #if _LIBCPP_DEBUG_LEVEL >= 2 __get_db()->swap(this, &__c);