c++ - C++ 中奇怪的引用行为

标签 c++

我的问题很短:

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/

相关文章:

c++ - 奇怪的类重新定义错误

c++ - 比较 std::vector 在命名空间中使用自己的类不编译

c++ - C++ While 语句中的 AND 运算符

c++ - 如何在比较中使用成员函数?

c++ - Qt——QWidget到底是什么

c++ - _CrtSetBreakAlloc 使用内存内容而不是分配号

c++ - 为什么声明函数的顺序会改变 SFINAE 选择的重载?

c++ - 返回指向局部变量的指针?? (警告 C4172)

c++ - 带有 std::is_reference 的 std::enable_if 编译失败

c++ - 为什么这段代码在 C++ 中有内存泄漏