以下是出现问题的代码
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指针