在分配的存储UB上是指针算术

Is pointer arithmetic on allocated storage UB?

本文关键字:指针 UB 分配 存储      更新时间:2023-10-16

假设我想在不调用任何未定义的行为(UB)的情况下实现std :: vector。下面的代码是否调用UB:

struct X{int i;};
int main(){
  auto p = static_cast<X*>(::operator new(sizeof(X)*2));
  new(p) X{};
  new(p+1) X{};// p+1 UB?
}

从标准中选择一系列可能会有所帮助的报价:

[basic.stc.dynamic.allocation]

返回的指针(通过分配函数)应适当对齐,以便可以将其转换为指针 合适的完整对象类型(21.6.2.1),然后用于访问分配的存储中的对象或数组 (直到存储通过呼叫相应的Deallocation函数明确交易)。

[expr.add]

当将具有积分类型的表达式添加到指针中或从指针中添加时,结果具有类型 指针操作数。如果表达式p指向带有n个元素的数组对象的元素x [i], 表达式p j和j p(其中j具有值j)指向(可能是 - 丘脑)元素 x [i j]如果0&lt; = i j&lt; = n;否则,行为是不确定的。同样,表达式p -j指向 (可能是hypothity )元素x [i-j]如果0&lt; = i-j&lt; = n;否则,行为是不确定的。

我的解释是,分配提供了X的可能是错误的数组(在C 数组中是对象),因此分配的存储中的指针算术算术可能没有调用未定义的行为。还是我对假设的解释是错误的?如果以前的代码最新是ub?

,我该怎么办

是的,从技术上讲,它具有未定义的行为,尽管我们倾向于忽略这一点。P0593应该正确修复。

短语"可能是 - 息息"是指一个末端的"元素"(参考),不允许这种情况。