我试图了解std :: vector,我知道如果vector是一个包含用户定义类的向量,那么在类具有"的情况下调用它的析构函数非常重要。所有权"资源。在这种情况下,我想它会遍历每个元素并在每个元素上调用析构函数。
但是对于普通的旧数据,我不认为需要调用析构函数,只需要简单地删除整个块。如果我不得不猜测我说这会更快说,重新分配。
实现自己的数组类是否相当容易,区分这两者并根据需要做什么表现不同?感谢。
答案 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或者它会泄漏。