为什么引用文件会失效

Why are references ever invalidated?

本文关键字:失效 文件 引用文 引用 为什么      更新时间:2023-10-16

所以我看到了这个问题,它基本上说引用和迭代器一起无效。

我明白为什么迭代器在某些情况下是无效的,但为什么引用是无效的

从实际的角度来看,我不明白为什么需要这样做。

这只是一个设计决定,还是有一些实际的原因?

编辑:为了澄清,就我对底层结构的理解而言,它只是指向需要重新分配的数据的指针(数据(以及对它的引用(可以保持不变(。正确的

一些测试代码:

#include <vector>
#include <iostream>
using namespace std;
int main()
{
    vector<string> yourVect;
    yourVect.push_back("def");
    vector<string>::iterator iter = yourVect.begin();
    const string& ref = *iter;
    yourVect.insert(yourVect.begin(), "abc");
    cout << ref << endl; // !! --- doesn't work - why ?? --- !!
    cout << *iter << endl; // obviously doesn't work
}

如果在向量的开头插入一个字符串,则所有数据都必须向前移动一个位置,如果vector的容量耗尽,则vector必须重新分配。

因此,往好了说,引用现在将指代不同的数据,往坏了说,它将指代无效的内存位置:如果向量重新分配,则分配新的内存块,旧数据在新块中复制1,并且旧块被解除分配;由于所有旧引用都指向旧块内的内存位置,因此它们都将无效。

保证考虑"最坏情况",这就是为什么不能保证在insert操作之后,引用仍然有效。或者,换句话说,插入向量可能会使迭代器和引用无效。

此外,我不明白为什么你认为引用和迭代器之间的这种行为有很大的区别——vector迭代器通常只是指向引用的vector位置的指针(通常隐藏在实现定义的类中(,所以它或多或少与引用相同。


  1. IIRC在C++11中实际上是"移动"的(如std::move(;这并没有改变旧引用将继续指向然后释放的内存的事实