微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从分配器返回的内存指针算法

如何解决从分配器返回的内存指针算法

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

考虑以下代码

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

我正在 mem[1] 处构造一个对象,即使 mem[0] 处的对象尚不存在。 据我所知,指针算术在创建的非构造对象数组上定义得很好。但是,this 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 之间的答案有变化吗?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。