C ++对象可以存储在最高内存位置吗?

时间:2014-09-22 21:40:33

标签: c++ arrays pointers object byte

最高内存位置(可能是(void*)(std::uintptr_t)-1)是否是存储C ++对象的有效地址?

2 个答案:

答案 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指针访问”。