我正在阅读一些关于 STL 的文档,其中写到该函数返回容器最后一个元素旁边end()
的字节的迭代器。
我想知道,如果容器占据了整个可用内存的最后一个字节怎么办。那时会发生什么?
我正在阅读一些关于 STL 的文档,其中写到该函数返回容器最后一个元素旁边end()
的字节的迭代器。
我想知道,如果容器占据了整个可用内存的最后一个字节怎么办。那时会发生什么?
C++ 内存模型保证您始终可以在数组的最后一个元素之后形成指向该元素的指针。如果没有,则系统不会让您在此位置分配对象,或者它会环绕。另外,请注意,这对于数组来说是一个潜在的问题,因为其他容器可以使用迭代器类型来以其他合适的形式处理过去的结束位置:它们完全控制增量操作的工作方式。
一个结束迭代器(至少形象地)指向刚刚超过容器的末尾。容器中的有效项目从*container.begin()
到*container.end()-1
。
换句话说,您可以将其他一些迭代器与结束迭代器进行比较以查看它们是否相等(这告诉您已经到达容器中项目的末尾),但您不能取消引用该结束迭代器(即,您不得尝试访问它所引用的项目)。
编辑:对不起,有点误解了这个问题:好吧,如果容器实际上使用了内存的最后一个字节(罕见/不太可能,但理论上可能),您通常会看到地址环绕到内存的开头,假设它是当然,在地址方面确实有效的迭代器。在这种情况下,您通常会看到它变成一个0
地址,该地址仍然可以与任何有效地址区分开来(即,0
将转换为一个空指针,它不能是一个有效指针)。
然而,在典型情况下,这种事情很可能不会被允许发生。例如,在大多数 32 位系统上,用户被限制使用前 2 或 3 GB 的地址空间,而高位地址是为操作系统保留的。