std :: vector在清除或删除POD时的行为是否不同

时间:2016-11-29 08:49:05

标签: c++ memory vector dynamic std

我试图了解std :: vector,我知道如果vector是一个包含用户定义类的向量,那么在类具有"的情况下调用它的析构函数非常重要。所有权"资源。在这种情况下,我想它会遍历每个元素并在每个元素上调用析构函数。

但是对于普通的旧数据,我不认为需要调用析构函数,只需要简单地删除整个块。如果我不得不猜测我说这会更快说,重新分配。

实现自己的数组类是否相当容易,区分这两者并根据需要做什么表现不同?感谢。

1 个答案:

答案 0 :(得分:1)

从gcc vector实现:

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;
}

它从vector的开头调用std :: _ Destroy(__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 :: destroy,而不是立即释放所有内存块。

编辑:你写了But it would seem when clearing vector that it does call delete on its elements - 答案很重要。 STL容器没有OWN外部分配的内存,你总是必须调用delete或使用shared \ unique_ptr或者它会泄漏。