首页 > 解决方案 > 从分配器返回的内存指针算法

问题描述

我知道这个问题在过去已经被问过并得到了一些回答。
但是,我对尚未清除的细节有疑问(或者至少我找不到质量保证)。

考虑以下代码:

T *mem = allocator_traits::allocate(allocator, 10);
allocator_traits::construct(allocator, mem+1, params...);

mem[1]即使对象 atmem[0]尚不存在,我也在构造对象。据我了解,指针算术在创建的未构造对象数组上得到了很好的定义。但是,QA 并未回答此特定情况:

我应该说,当我说 storage + i 将在 P0593 下得到很好的定义时,我假设元素 storage[0]、storage[1]、...、storage[i-1] 已经构建。尽管我不确定我对 P0593 的理解是否足够好,无法得出结论,它也不会涵盖尚未构建这些元素的情况。

换句话说,作者说这可能是UB。另一方面,它会使实现无法std::vector执行以下操作:

buf_end_size = newbuf + sizeof(T) * size();

由于我希望它是有效的代码(并且我在某些实现中看到了这一点),这意味着指针算术对于i未构造对象时的任何值也有很好的定义。

所以,我的问题是:这个 UB 还是我可以安全地对返回的指针进行指针运算allocate,例如,如果我想在位置 0 之前在位置 1 构造元素?另外,C++17 和 C++20 之间的答案会改变吗?

标签: c++c++17language-lawyerc++20pointer-arithmetic

解决方案


推荐阅读