1、当vector的内存用完了,它是如何动态扩展内存的?它是怎么释放内存的?用clear可以释放掉内存吗?是不是线程安全的?
1.1、所谓动态增加内存,并不是在原空间之后增加新空间(因为无法保证原空间之后尚有可供配置的空间),而是以原大小的两倍另外配置一块较大空间,然后将原内容拷贝过来,然后才开始在原内容之后构造新元素,并释放原空间。
1.2、清空vector中的元素是使用clear,clear是调用erase,清除迭代器position指向的元素,erase调用copy,将position后面的元素position+1,finish复制到position处,同时finish迭代器往前移一步,再调用destroy(finish),最后返回position迭代器。
pop_back()同clear()都是只清除数据,但是不释放内存,此时运行vector.empty(),会输出1,vector.size() = 0表示vector中已经没有元素,但是调用vector[0]仍会有值输出,vector.capacity()!=0;这时候push_back(1)会把vector[0]覆盖;
想要释放内存,采用的方法是用swap交换到一个新的vector,将原vecto拷贝出去,然后自然销毁(内存空间是在vector析构时候被系统回收)
swap方法的原理是交换两个vector的内部指针以达到“交换整个容器”的效果,所以在和默认的临时变量swap后,成员变量_managedObjectArray确实是个空的容器(包括内存)
参考:https://blog.csdn.net/u011021773/article/details/80480035
int main()
{
int ia[] = { 1,8 };
vector<int> iv(ia, ia + sizeof(ia) / sizeof(int));
cout << iv.size() << " " << iv.capacity() << endl; //2 2
iv.clear();
cout << iv.size() << " " << iv.capacity() << endl; //0 2
// vector<int>().swap(iv);
vector<int> temp;
temp.swap(iv);
cout << temp.size() << " " << temp.capacity() << endl; //0 2
cout << iv.size() << " " << iv.capacity() << endl; //0 0
return 0;
}
1.3、引用《effective stl》的第十二条:当涉及 STL容器和线程安全性时,你可以指望一个 STL库允许多个线程同时读一个容器,以及多个线程对不同的容器做写入操作。你不能指望 STL库会把你从手工同步控制中解脱出来,而且你不能依赖于任何线程支持。必须自己去写多线程安全措施。