最高内存位置(可能是(void*)(std::uintptr_t)-1
)是否是存储C ++对象的有效地址?
答案 0 :(得分:2)
vect.end()
永远不会小于vect.begin()
。它们等于vect.empty()
。
(void*)(uintptr_t)-1
(通常与(void*)(size_t)-1
相同)指向虚拟内存的最大可寻址字节。根据体系结构和环境,它可以是有效或无效的内存位置。
向量的最后一个元素(*(vect.end() - 1)
)可以驻留在最大的虚拟内存地址上。
答案 1 :(得分:2)
绝对不能保证地址-1无效。但是,这是最高的地址。
当然,迭代器与有效内存地址或size_t
的值无关。只是他们使用operator<(iterator, iterator)
以理智的方式进行比较。当然,如果v.begin()
为-1
,则v.end()
不能高于v.begin()
,因为根据定义,它可以在机器中使用的最高地址 - 除此之外的一个字节是0,它位于内存的最低地址。
我非常怀疑你实际上可以设想这种情况,但从技术上讲,假设迭代器实际上是作为指针实现的,如果你有vector<char>
,并且设法在-1
处分配一个指针,然后v.end()
实际上是零。但是,您真的必须使用它,因为该内存通常是为内核空间保留的(并且可能受操作系统保护以检测“对NULL指针对象的负偏移”)。
因此,虽然不能保证不会发生这种情况,但实际上很可能确定系统的设计不会发生这种情况。
根据重新提出的问题进行编辑:
C ++标准不排除使用最高可用地址。但正如上面的文字所说,你必须非常努力地在基于现代处理器的系统中实际使用它,并且具有现代操作系统(Linux,Windows等),因为内存范围保留给捕获“坏NULL指针访问”。