C++ 指针算法是否在分配的存储上?

C++ 指针算法是否在分配的存储上?,c++,memory-management,language-lawyer,C++,Memory Management,Language Lawyer,假设我想要实现std::vector,而不调用任何未定义的行为(UB)。下面的代码是否调用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? } 结构X{int i;}; int main(){ 自动p=静态_转换(::运算符新(sizeof(X)*2)); 新的(p)X{}

假设我想要实现std::vector,而不调用任何未定义的行为(UB)。下面的代码是否调用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?
}
结构X{int i;}; int main(){ 自动p=静态_转换(::运算符新(sizeof(X)*2)); 新的(p)X{}; 新的(p+1)X{};//p+1ub? } 以下是从标准中选择的可能有帮助的报价:

[basic.stc.dynamic.allocation]

(通过分配函数)返回的指针应适当对齐,以便将其转换为指向任何 合适的完整对象类型(21.6.2.1),然后用于访问分配的存储中的对象或阵列 (直到通过调用相应的释放函数显式释放存储)

[expr.add]

将具有整型的表达式添加到指针或从指针中减去时,结果具有整型 指针操作数的。如果表达式P指向具有n个元素的数组对象x的元素x[i], 表达式P+J和J+P(其中J的值为J)指向(可能是假设的)元素
x[i+j]如果0是,从技术上讲,它具有未定义的行为,尽管我们倾向于忽略这一点。应该把它修好


短语“可能是假想的”指的是超过“elements”(元素)结尾的一个,不允许出现这种情况。

实际上,它不可编译。希望你添加几行代码来实现这一点会不会太过分?没有错,为什么你不能在这里发布代码作为你问题的一部分?@NeilButterworth:你为什么要这样做?这个问题已经完全可以理解了。@NeilButterworth严肃地说,我认为很明显表达式必须出现在某个代码块中,“…”表示“某物”。我做到了!我认为这个假设在这里的意思是“最后一个元素之后的元素”。但我不确定。它不应该是UB。但我让其他人回答这个问题,我远非语言律师。