使用vector容器出现读取访问冲突的原因

以下是出现问题的代码

struct STR_LOCATION{
	vector<short> a;
	vector<short> a;
};
int main() {
	STR_LOCATION* location;
	location = (STR_LOCATION*)calloc(1,sizeof(STR_LOCATION));
	location->a.push_back(1);
	cout << location->a.capacity() << endl;
	cout << &location->a[0] << endl;
	location->a.push_back(1);
	cout << location->a.capacity() << endl;
	location->a.push_back(1);
	cout << location->a.capacity() << endl;
	location->a.push_back(1);
	cout << location->a.capacity() << endl;
	location->a.push_back(1);
	cout << location->a.capacity() << endl;
	cout << &location->a[0] << endl;
	location->a.push_back(1);
	cout << location->a.capacity() << endl;
	
	free(location);
	return 0;
}

该代码在执行最后一次push_back指令时,会报“读取访问权限冲突”的错误。
以下是代码打印结果
在这里插入图片描述

其原因在于,vector容器指向一片连续的内存空间。其容量capacity原本是0。随着数据的不断压入,容量会不断扩容。当大于某一阈值后,计算机会选择将内存空间中的数据拷贝到另外一处内存地址,并删除原有内存地址上的数据。

代码中,当第五次push操作后,a的地址发生了改变,而location->a的地址仍是旧地址,因此报错。

解决方法:
1.提前扩容(reserve函数)
2.不使用指向vector指针

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

没时间解释了快上车

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值