首页 > 试题广场 >

C++ STL中vector调用push_back时,其内部

[问答题]

C++ STL中vector的相关问题:
1)调用push_back时,其内部的内存分配是如何进行的?
2)调用clear时,内部是如何具体实现的?若想将其内存释放,该如何操作?

推荐

vector的工作原理是系统预先分配一块CAPACITY大小的空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小。
vector
为了防止大量分配连续内存的开销,保持一块默认的尺寸的内存,clear只是清数据了,未清内存,因为vectorcapacity容量未变化,系统维护一个的默认值。

有什么方法可以释放掉vector中占用的全部内存呢?

标准的解决方法如下
template < class T >
void ClearVector( vector< T >& vt )
{
vector< T > vtTemp;
veTemp.swap( vt );
}

事实上,vector根本就不管内存,它只是负责向内存管理框架acquire/release内存,内存管理框架如果发现内存不够了,就malloc,但是当vector释放资源的时候(比如destruct), stl根本就不调用free以减少内存,因为内存分配在stl的底层:stl假定如果你需要更多的资源就代表你以后也可能需要这么多资源(你的list, hashmap也是用这些内存),所以就没必要不停地malloc/free。如果是这个逻辑的话这可能是个trade-off

一般的STL内存管理器allocator都是用内存池来管理内存的,所以某个容器申请内存或释放内存都只是影响到内存池的剩余内存量,而不是真的把内存归还给系统。这样做一是为了避免内存碎片,二是提高了内存申请和释放的效率——不用每次都在系统内存里寻找一番。

发表于 2014-10-25 00:26:06 回复(1)
调用push_back的时候,若添加的元素并未超过总的预定义容量大小,则内存不变,若超过,则根据编译器,自动寻找一块大于现在容量的内存,将原数据复制到新的内存中,并把原内存释放掉
clear时,清空了对应内存中的所有数据,size的结果为0,但是内存并没有被释放,若此时调用capacity,并不会改变容量大小,若想释放,需用swap将原来的数据复制与新的内存中,则原内存会被释放。
发表于 2018-08-06 11:27:41 回复(0)

vector的工作原理是系统预先分配一块CAPACITY大小的空间,当插入的数据超过这个空间的时候,这块空间会让某种方式扩展,但是你删除数据的时候,它却不会缩小。
vector
为了防止大量分配连续内存的开销,保持一块默认的尺寸的内存,clear只是清数据了,未清内存,因为vectorcapacity容量未变化,系统维护一个的默认值。

发表于 2014-10-25 00:26:06 回复(0)