mirror of
https://github.com/boostorg/container.git
synced 2025-08-02 14:04:26 +02:00
Fix ticket #13500: Memory leak when using erase on string vectors
This commit is contained in:
@@ -1243,6 +1243,7 @@ use [*Boost.Container]? There are several reasons for that:
|
|||||||
* [@https://github.com/boostorg/container/pull/61 GitHub #61: ['"Compile problems on Android ndk r16 beta 1"]].
|
* [@https://github.com/boostorg/container/pull/61 GitHub #61: ['"Compile problems on Android ndk r16 beta 1"]].
|
||||||
* [@https://github.com/boostorg/container/pull/64 GitHub #64: ['"Fix splice for slist"]].
|
* [@https://github.com/boostorg/container/pull/64 GitHub #64: ['"Fix splice for slist"]].
|
||||||
* [@https://github.com/boostorg/container/issues/58 GitHub #65: ['"`pmr::monotonic_buffer_resource::allocate()` can return a pointer to freed memory after `release()` is called"]].
|
* [@https://github.com/boostorg/container/issues/58 GitHub #65: ['"`pmr::monotonic_buffer_resource::allocate()` can return a pointer to freed memory after `release()` is called"]].
|
||||||
|
* [@https://svn.boost.org/trac/boost/ticket/13500 Trac #13500: ['"Memory leak when using erase on string vectors"]].
|
||||||
|
|
||||||
[endsect]
|
[endsect]
|
||||||
|
|
||||||
|
@@ -2023,7 +2023,7 @@ class vector
|
|||||||
T *const beg_ptr = this->priv_raw_begin();
|
T *const beg_ptr = this->priv_raw_begin();
|
||||||
T *const new_end_ptr = ::boost::container::move(pos_ptr + 1, beg_ptr + this->m_holder.m_size, pos_ptr);
|
T *const new_end_ptr = ::boost::container::move(pos_ptr + 1, beg_ptr + this->m_holder.m_size, pos_ptr);
|
||||||
//Move elements forward and destroy last
|
//Move elements forward and destroy last
|
||||||
this->priv_destroy_last(pos_ptr == new_end_ptr);
|
this->priv_destroy_last(pos_ptr != new_end_ptr);
|
||||||
return iterator(p);
|
return iterator(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2557,7 +2557,8 @@ class vector
|
|||||||
void priv_destroy_last(const bool moved = false) BOOST_NOEXCEPT_OR_NOTHROW
|
void priv_destroy_last(const bool moved = false) BOOST_NOEXCEPT_OR_NOTHROW
|
||||||
{
|
{
|
||||||
(void)moved;
|
(void)moved;
|
||||||
if(!(value_traits::trivial_dctr || (value_traits::trivial_dctr_after_move && moved))){
|
const bool skip_destructor = value_traits::trivial_dctr || (value_traits::trivial_dctr_after_move && moved);
|
||||||
|
if(!skip_destructor){
|
||||||
value_type* const p = this->priv_raw_end() - 1;
|
value_type* const p = this->priv_raw_end() - 1;
|
||||||
allocator_traits_type::destroy(this->get_stored_allocator(), p);
|
allocator_traits_type::destroy(this->get_stored_allocator(), p);
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user