我正在尝试了解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,否则会泄漏。