STD :: vector在清除或删除POD方面的行为会有所不同



我正在尝试了解std :: vector,我知道,如果向量是包含用户定义类的矢量"资源。在这种情况下,我认为它会循环遍历每个元素,并在每个元素上调用破坏者。

但是,对于普通的旧数据,我认为不需要称呼攻击器,而只需要简单地删除整个块。如果我不得不猜测,我会说这会更快,即重新分配。

实现自己的数组类别会很容易区分这两者,并且根据需要做的事情的行为不同吗?谢谢。

来自GCC矢量实现:

void
clear()
{ _M_erase_at_end(this->_M_impl._M_start); }

因此,清晰调用受保护函数_m_erase_at_end,让我们看:

void
_M_erase_at_end(pointer __pos)
{
    std::_Destroy(__pos, this->_M_impl._M_finish, _M_get_Tp_allocator());
    this->_M_impl._M_finish = __pos;
}

它称为std :: _从向量的开始(__POS开始)直到结束。

template<typename _ForwardIterator, typename _Allocator>
void
_Destroy(_ForwardIterator __first, _ForwardIterator __last,
     _Allocator& __alloc)
{
typedef __gnu_cxx::__alloc_traits<_Allocator> __traits;
for (; __first != __last; ++__first)
__traits::destroy(__alloc, std::__addressof(*__first));
}

因此,它是整个内部数组的迭代,并调用__ Traits :: Destery,而不是一次释放所有内存块。

编辑:您写了But it would seem when clearing vector that it does call delete on its elements-答案很大。STL容器不拥有外部分配的内存,您始终必须调用delete或使用共享 unique_ptr,否则会泄漏。

最新更新