为什么libstdc ++的std :: vector的ctor实现不会导致内存泄漏?

时间:2018-01-31 10:57:02

标签: c++ c++11 vector memory-leaks

我正在使用带有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 ++是经过充分测试的知名库。我的理解一定是不正确的。

为什么这个实现中没有内存泄漏?

1 个答案:

答案 0 :(得分:6)

__uinitialized_copy_a抛出的极少数情况下(仅当分配器使用时),内存将被_Vector_base的析构函数释放出来。

这与在您自己的代码中使用本地std::vector在范围内抛出异常或者本地静态分配的std::vector超出范围基本相同。内存将被析构函数中的向量释放。

在此功能中,请注意_uinitialized_copy_a复制元素。存储已经存在且有效。如果未将存储分配给向量的内部存储变量,那么您将是正确的,但这不是这种情况,并且可以像往常一样释放存储。