yum*_*odo 1 c++ memory-leaks vector c++11
我正在使用带有libstdc ++的GCC 7.3.0.
这是std::vector
ctor的实施.
vector(initializer_list<value_type> __l,
const allocator_type& __a = allocator_type())
: _Base(__a)
{
_M_range_initialize(__l.begin(), __l.end(),
random_access_iterator_tag());
}
// Called by the second initialize_dispatch above
template<typename _ForwardIterator>
void
_M_range_initialize(_ForwardIterator __first,
_ForwardIterator __last, std::forward_iterator_tag)
{
const size_type __n = std::distance(__first, __last);
this->_M_impl._M_start = this->_M_allocate(__n);
this->_M_impl._M_end_of_storage = this->_M_impl._M_start + __n;
this->_M_impl._M_finish =
std::__uninitialized_copy_a(__first, __last,
this->_M_impl._M_start,
_M_get_Tp_allocator());
}
Run Code Online (Sandbox Code Playgroud)
在函数中_M_range_initialize(_ForwardIterator,_ForwardIterator,std::forward_iterator_tag)
,当我std::__uninitialized_copy_a
抛出异常时,this->_M_impl._M_start
在这个函数中分配的异常将不会被释放.
这意味着此实现将导致内存泄漏.
但是,libstdc ++是经过充分测试的知名库.我的理解一定是不正确的.
为什么这个实现中没有内存泄漏?
在极少数情况下__uinitialized_copy_a
抛出(仅当分配器使用时),内存将被析构函数释放,_Vector_base
就像往常一样.
这与使用本地std::vector
范围在您自己的代码中抛出异常或者如果本地静态分配std::vector
超出范围基本相同.内存由析构函数中的向量释放.
在此函数中,请注意_uinitialized_copy_a
仅复制元素.存储已经存在且有效.如果存储未分配给向量的内部存储变量,那么您将是正确的,但这不是这种情况,并且可以像往常一样释放存储.
归档时间: |
|
查看次数: |
115 次 |
最近记录: |