c++ - 从分配器返回的内存指针算法
问题描述
我知道这个问题在过去已经被问过并得到了一些回答。
但是,我对尚未清除的细节有疑问(或者至少我找不到质量保证)。
考虑以下代码:
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 之间的答案会改变吗?
解决方案
推荐阅读
- javascript - ui路由器中的Angular Provider访问
- vulkan - 如何正确共享 VkDeviceMemory?VkExternalMemoryBufferCreateInfoKHR 有什么用?
- javascript - 阻止执行特定的内联脚本标签
- liquibase - Liquibase 3.6.0 在 Oracle DB 中失败 - 有什么解决方法吗?
- python - 获取json的值
- html - CSS - 缩小背景 div
- java - Android Gradle 包含本地 JAR 文件
- wagtail - 鹡鸰依赖问题
- jquery - 不明白它是如何工作的
- ruby-on-rails - 有条件的订单元素