STL源码解析(一)

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库会把你从手工同步控制中解脱出来,而且你不能依赖于任何线程支持。必须自己去写多线程安全措施。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值