我无法找到任何实际用途,但我仍然很好奇为什么我在与不同声明范围相同的语句范围内运行时会得到不同的结果?< / p>
suspend (T) -> R
int num = 3;
vector<int> ivec;
vector<int*> ipvec;
for (int i = 0; i != num; ++i)
{
ivec.push_back(i);
ipvec.push_back(&ivec[i]);
}
for (int i = 0; i != num; ++i)
{
cout << "ivec:\t" << ivec[i] << endl;
cout << "ipvec:\t" << *ipvec[i] << endl;
}
ivec: 0
*ipvec: -572662307
ivec: 1
*ipvec: -572662307
ivec: 2
*ipvec: 2
int num = 3;
vector<int> ivec;
vector<int*> ipvec;
for (int i = 0; i != num; ++i)
ivec.push_back(i);
for (int i = 0; i != num; ++i)
ipvec.push_back(&ivec[i]);
for (int i = 0; i != num; ++i)
{
cout << "ivec:\t" << ivec[i] << endl;
cout << "*ipvec:\t" << *ipvec[i] << endl;
}
答案 0 :(得分:4)
所以std :: vector根据输入分配内存并调整大小。因此,在变体1中,您将跨越第一个分配大小(在本例中为2)。因此,[0]和[1]的指针不再有效,因为向量中的数组已经重新分配,现在具有不同的地址。在变体2中,您没有此问题,因为您已经分配了向量的完整列表,因此您添加的所有指针都是有效的。这不是范围问题,而是从事实上std :: vector在列表增长时基于2的幂分配内部数组。 (因此为什么[2]在两次迭代中都有效(因为内部数组的末尾大小为4)。