2016-11-29 100 views
2

我想了解std :: vector,并且我知道如果vector是一个包含用户定义的类的向量,那么调用它的析构函数以防万一类拥有资源的“所有权”。在这种情况下,我想它会遍历每个元素并在每个元素上调用析构函数。std :: vector对于清除或删除POD有不同的作用

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

实现你自己的数组类会相当容易地区分这两者,并根据需要做什么而有所不同?谢谢。

+3

“清楚”是什么意思?何时或为何矢量需要“清除”其数据?你能否展示一些代码来说明你的问题和你遇到的问题?最重要的是,这只是好奇心还是你想解决的实际问题?那么*实际*问题是什么? –

+0

没有'std :: is_pod'就不容易区分。标准库实施者不需要执行此检查。但如果受欢迎的人不这样做,我会感到惊讶。 – StoryTeller

+1

如果我正确地解决了你的问题,你会问:“我可以只用std :: vector memset清除或初始化POD?”。这不是非常C++的 - 做事的方式,因为如果你以后添加一个会将你的类型变成非pod的成员,你可能会破坏事情。 –

回答

1

从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 ::破坏,不释放所有的内存块一次。

编辑:你写了But it would seem when clearing vector that it does call delete on its elements - 答案很大NO。 STL容器不是OWN外部分配的内存,您始终必须调用delete或使用shared \ unique_ptr或它将会泄漏。

+0

我知道指针向量不会释放指针指向的内存。然后不向量区分指向类型和类型的指针?它似乎调用删除矢量的每个元素,但不是矢量,这将是一个泄漏,我认为。 – Zebrafish

相关问题