我正在使用带有libstdc ++的GCC 7.3.0。
以下是If Availability < DLookup("[Availability]", "[tbl_RAG]", "[Department] = 'Outbound'") - 0.02 Then RAGAvailability.ForeColor = RGB(192, 0, 0) 'red
的ctor实施。
std::vector
在函数 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());
}
中,当_M_range_initialize(_ForwardIterator,_ForwardIterator,std::forward_iterator_tag)
抛出异常时,我认为这个函数中分配的std::__uninitialized_copy_a
将不会被释放。
这意味着此实现将导致内存泄漏。
然而,libstdc ++是经过充分测试的知名库。我的理解一定是不正确的。
为什么这个实现中没有内存泄漏?
答案 0 :(得分:6)
在__uinitialized_copy_a
抛出的极少数情况下(仅当分配器使用时),内存将被_Vector_base
的析构函数释放出来。
这与在您自己的代码中使用本地std::vector
在范围内抛出异常或者本地静态分配的std::vector
超出范围基本相同。内存将被析构函数中的向量释放。
在此功能中,请注意_uinitialized_copy_a
仅复制元素。存储已经存在且有效。如果未将存储分配给向量的内部存储变量,那么您将是正确的,但这不是这种情况,并且可以像往常一样释放存储。