Is pointer arithmetic on allocated storage UB?

前提是你 提交于 2020-01-11 11:35:11

问题


Let's say I want to implement std::vector without invoking any undefined behavior (UB). Is the code below invokes 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?
}

Folowing a selection of quote from the standard that may help:

[basic.stc.dynamic.allocation]

The pointer returned (by an allocation function) shall be suitably aligned so that it can be converted to a pointer to any suitable complete object type (21.6.2.1) and then used to access the object or array in the storage allocated (until the storage is explicitly deallocated by a call to a corresponding deallocation function).

[expr.add]

When an expression that has integral type is added to or subtracted from a pointer, the result has the type of the pointer operand. If the expression P points to element x[i] of an array object x with n elements, the expressions P + J and J + P (where J has the value j) point to the (possibly-hypothetical) element x[i + j] if 0<=i + j<=n; otherwise, the behavior is undefined. Likewise, the expression P - J points to the (possibly-hypothetical) element x[i − j] if 0<=i − j <=n; otherwise, the behavior is undefined.

My interpretation is that allocation provides an possibly-hypothetical array of X (in C++ arrays are objects) so pointer arithmetic on allocated storage as in the exemple may not invoke undefined behavior. Or my interpretation of hypothetical is wrong? How could I do if the previous code snipest is UB?


回答1:


Yes, technically it has undefined behaviour, though we tend to ignore that. P0593 should fix it properly.

The phrase "possibly-hypothetical" refers to one-past-the-end "elements" (ref), and does not permit this case.



来源:https://stackoverflow.com/questions/46018409/is-pointer-arithmetic-on-allocated-storage-ub

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!