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

yum*_*odo 1 c++ memory-leaks vector c++11

我正在使用带有libstdc ++的GCC 7.3.0.

这是std::vectorctor的实施.

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

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

Rak*_*111 6

在极少数情况下__uinitialized_copy_a抛出(仅当分配器使用时),内存将被析构函数释放,_Vector_base就像往常一样.

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

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