如果在 std::uninitialized_default_construct 之后需要 std::launder

问题描述 投票:0回答:1

我有一个类似于下面的代码,它使用分配器来分配原始内存,然后使用

std::uninitialized_default_construct_n
(或同族的另一个函数)在其中构造对象。

std::allocator<T> allocator;
T* buffer = allocator.allocate(n);
std::uninitialized_default_construct_n(buffer, n);
buffer = std::launder(buffer); // needed?
...
std::destroy_n(buffer, n);
allocator.deallocate(buffer, n);

之后是否需要在指针上使用

std::launder
来通知编译器指针现在指向
T
对象?或者构造函数隐式地做同样的事情?

它用于容器类,我想避免稍后将被复制分配到的值构造(而不是默认构造)对象。

c++ memory-management c++17 allocator stdlaunder
1个回答
0
投票

不,

std::launder
可能只在分配器本身中是必需的,而不是在使用它的地方。 注意
allocate
的效果:

a.allocate(n, y)

结果

XX​::​pointer

效果:为
n
T
的数组分配内存,创建了这样的对象,但未构造数组元素。
备注:默认:
a.allocate(n)

- [分配器.要求.一般]

allocate

尽管数组元素的生命周期尚未开始,但周围数组的生命周期已经开始。 这意味着可以使用返回的指针正常访问数组的元素。

仅当您获得的指针的来源根本不会返回到

std::launder

 对象(或其数组)时,
T
才是必要的。

© www.soinside.com 2019 - 2024. All rights reserved.