我经常看到代码添加一个值,例如指针的长度,然后使用这个值,例如
T* end = buffer + bufferLen;//T* + size_t
if (p < end)
Run Code Online (Sandbox Code Playgroud)
但是,缓冲区是否有可能在"buffer + bufferLen"可能溢出的内存末尾附近分配(例如0xFFFFFFF0 + 0x10),导致"p <end"为假,即使p是有效的元素地址(例如0xFFFFFFF8).
如果有可能的话,当我看到许多与开始/结束范围一起工作的东西时,如何避免在最后一个元素之后结束下一个元素
从标准:
5.9关系运算符[expr.rel]
如果两个指针指向同一数组的元素或超出数组末尾的指针,则指向具有较高下标的对象的指针会比较高.
所以你不必担心; 一致的实现将确保过去的结束指针与数组的其余部分正确比较.此外,
3.7.4.1分配函数[basic.stc.dynamic.allocation]
[...]返回的指针应适当对齐,以便可以将其转换为具有基本对齐要求(3.11)的任何完整对象类型的指针,然后用于访问分配的存储中的对象或数组[.. ]
这意味着返回的指针应该能够被视为指向适当大小的数组开头的指针,因此5.9继续保持.如果分配函数调用是调用的结果operator new[](5.3.4:5),则会出现这种情况.
实际上,如果你在一个平台上,可以想象分配器(非一致地)返回一个结束的内存块0xFFFFFFFF,你可以在大多数情况下写
if (p != end)
Run Code Online (Sandbox Code Playgroud)