我尝试将int的指针向量设置为另一个向量的元素
vector<int> vecInt;
vector<int*> vecPInt;
int main()
{
vecInt.push_back(1);
vecPInt.push_back(&vecInt[0]);
vecInt.push_back(1);
vecPInt.push_back(&vecInt[1]);
for(auto v:vecInt)
{
cout<<v<<"\n";
}
for(auto v:vecPInt)
{
cout<<*v<<"\n";
}
}
但结果是
1
1
11717664
1
还有另一种方法可以做到这一点。但为什么在这种情况下这是行为?
答案 0 :(得分:5)
第二次将元素推回向量vecInt
时,向量的容量会发生变化。分配了两倍大小的新区域,因此旧指针开始指向其他内容。基本上,只要向量的大小达到其容量,就必须重新分配向量,并使所有指向序列中元素的指针无效。
看看When does a std::vector reallocate its memory array?
答案 1 :(得分:3)
我同意另一个答案。访问该地址是未定义的行为,因为您可能正在访问可能最有可能被腾空的地址
使用vector::reserve
,问题将一直消失,地址将保持不变。 Demo