小编voi*_*xb3的帖子

如何使用指向自定义分配器(无 UB)提供的原始内存的指针?

我正在尝试编写一个分配器感知容器。假设我想为三个对象分配一块内存:

T* chunk = std::allocator_traits<Allocator>::allocate(allocator, 3);
Run Code Online (Sandbox Code Playgroud)

(我知道分配器可以有自定义指针类型,因此我应该使用std::allocator_traits<Allocator>::pointer;为了简单起见,我在这里使用原始指针。)

现在我想在索引 2 处创建一个实际对象。我该怎么做?特别是,如何计算指向尚不存在的元素的指针?最明显的选项如下:

std::allocator_traits<Allocator>::construct(allocator, chunk + 2, ...);
Run Code Online (Sandbox Code Playgroud)

不幸的是,chunk + 2似乎并不正确:根据标准,指针运算只能对指向数组元素的指针执行,否则会导致未定义的行为。出于同样的原因,我无法将指针转换为指针std::byte*并对其使用指针算法。(虽然std::allocator定义为在新分配的内存中创建数组,但在 C++20 之前,自定义分配器不存在相同的要求。此外,虽然 C++20 增加了一些“隐式创建对象”的语言,但这并没有申请较早的 C++ 版本。)

那么如何计算要作为第二个参数给出的指针construct而不导致未定义的行为(在 C++20 之前)?

c++ undefined-behavior allocator language-lawyer c++17

5
推荐指数
1
解决办法
193
查看次数