为什么引用无效?

时间:2013-02-23 21:17:11

标签: c++ stl reference iterator

所以我看到this question,基本上说引用和迭代器一起失效。

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

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

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

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

一些测试代码:

#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
}

1 个答案:

答案 0 :(得分:2)

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

所以,最好参考现在将引用不同的数据,最坏的情况是它将引用无效的内存位置:如果向量重新分配,则分配新的内存块,旧的数据被复制 1 在新块中,旧块被解除分配;由于所有旧引用都指向旧块内的内存位置,因此它们都将无效。

保证意味着“最坏情况”,这就是为什么不能保证在insert操作之后,引用仍然有效。或者,以另一种方式说,插入向量可能使迭代器和引用无效。

另外,我不明白为什么你认为引用和迭代器之间的这种行为有很大差异 - vector迭代器通常只是指向引用的vector位置的指针(通常隐藏在里面)实现定义的类),因此它与引用或多或少相同。


  1. IIRC在C ++ 11中实际上它们被“移动”了(如在std::move中);这并没有改变旧引用将继续指向当时释放的内存的事实。