我的问题很短:
vector<int> ints{1,2,3,4};
int &y = ints[0];
// ints.push_back(y);
y = 5;
for (auto &x : ints) {
cout << x << ", ";
}
为什么在评论时你会得到 5, 2, 3, 4
但是当你取消注释 ints.push_back(y);
你得到 1, 2, 3, 4, 1
.我会再写一次,以便完全清楚这个问题:你得到 [-->1<--], 2, 3, 4, 1
, 而不是 5, 2, 3, 4, 1
甚至 5, 2, 3, 4, 5
这种行为让我抓狂……背后发生了什么?
最佳答案
当你推回一个 vector 时,如果 vector 没有分配足够的内存来存储新元素,它会分配一个新的更大的内存块,移动元素,并释放旧内存。如果发生这种情况,任何指向 vector 元素的引用或指针都会失效。
因此,在推回之后,当您将 5
分配给 y
时,这是未定义的行为,因为 y
是无效引用,并且没有理由期望赋值会对 vector 的任何元素产生任何影响。
关于c++ - C++ 中奇怪的引用行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31760634/