c++中vector使用的小问题

接手项目原有代码,在昨天接到bug提示,一条数据处理时程序崩溃,于是有了这个查找问题的小总结。

gdb调试时问题定位到:malloc(): smallbin double linked list corrupted,然后看了那块儿的代码,并没有发现有问题,于是进入c++冥想时刻:c++是一个神奇的语言,很多崩溃问题出现的地方并不是真实的,就好比一个人后背总疼,贴了膏药拍了片子都没发现问题,后来医生会诊,内科说这是心梗的前兆,问题在于血管堵塞,于是病好了,背不疼了。于是结束冥想,一路向前查找代码,发现很早的一个数据处理的地方有多次的vector扩容,当然这个本身没有问题,这个是vector的一个机制,当空间不够用时,它会进行以下操作:
1、寻找更大空间
2、将原数据复制过去
3、释放原空间
那么,就需要提前reserve,预留空间,提高效率,在这个代码里,原作者同样做了reserve,但是由于数据不规整,就是与原作者的理想状态有点差异,导致了reserve的空间依然不足,就多次进行了另外的扩容,多次的申请空间,释放空间,会产生内存碎片,于是乎,在后面代码中同样进行多次申请与释放的时候,就出现申请的内存不够,失败的问题。
关于vector扩容,使用了一个测试代码:

void FillVector(vector<BigTestStruct>& testVector, int vsize)
{
	for (int i = 0; i < vsize; i++)
	{
		BigTestStruct bt;
		testVector.push_back(bt);
		cout << testVector.capacity() << endl;
	}
}

主要就测试扩容规则,在vs和linux中是不太一样的,vs中是1.5倍,Linux下是2倍。

以上,有问题请指正,谢谢!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值