在分配的存储UB上是指针算术
Is pointer arithmetic on allocated storage UB?
假设我想在不调用任何未定义的行为(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应该正确修复。
短语"可能是 - 息息"是指一个末端的"元素"(参考),不允许这种情况。
相关文章:
- 1d 智能指针不适用于语法 (*)++
- 在C#中处理C++指针而不使用unsafe的最佳方法
- 为什么使用 "this" 指针调用派生成员函数?
- 函数向量_指针有不同的原型,我可以构建一个吗
- 使用指针从C++中的数组中获取最大值
- 助记符和指向成员语法的指针
- 嵌入方指针压缩已禁用
- 数组的指针从不分段故障
- 通过指针恢复对数组的引用.UB与否?
- 传递给放置 new 的指针是否是指向其对象表示形式的非 UB 指针?
- 是否通过单元化指针UB访问静态类成员
- 当原始数据是常量时,修改指针指向的位置是 UB 吗?
- 通过reinterpret_casting方法指针从指针调用派生类的方法。这是 UB 吗?
- 泛型方法指针.reinterpret_cast指向不同类的方法指针,这是 UB 吗?
- 使用指针的法律遗留代码突然变成了 UB
- 移动指针是否经过结构成员 UB?并访问它?
- 在分配的存储UB上是指针算术
- 指向成员表达式UB的指针
- 关于指针积分加法中的类型、溢出和 UB 的混淆
- 同时修改指向值和指针UB