为什么引用文件会失效
Why are references ever invalidated?
所以我看到了这个问题,它基本上说引用和迭代器一起无效。
我明白为什么迭代器在某些情况下是无效的,但为什么引用是无效的?
从实际的角度来看,我不明白为什么需要这样做。
这只是一个设计决定,还是有一些实际的原因?
编辑:为了澄清,就我对底层结构的理解而言,它只是指向需要重新分配的数据的指针(数据(以及对它的引用(可以保持不变(。正确的
一些测试代码:
#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
位置的指针(通常隐藏在实现定义的类中(,所以它或多或少与引用相同。
- IIRC在C++11中实际上是"移动"的(如
std::move
(;这并没有改变旧引用将继续指向然后释放的内存的事实
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 调整窗口内存映射文件的大小,而不会使指针失效
- 为什么引用文件会失效