gpt4 book ai didi

c++ - 如何使用分配器精确模拟新的 T[n]?

转载 作者:行者123 更新时间:2023-11-30 03:00:53 25 4
gpt4 key购买 nike

表达式 new T[n] 可能会也可能不会初始化数组中的每个对象,这取决于 T 是什么。

如何使用 allocator 复制这种初始化行为?

struct Foo
{
int x;
Foo() : x(1)
{ }
};

Foo *p = new Foo[1];
assert(p[0].x == 1);

最佳答案

在 C++03 中,分配器接口(interface)只知道一种初始化对象的方法,那就是从另一个对象复制。 C++11 有更多。

您要求进行默认初始化,这意味着(大约)“要么什么都不做,要么调用默认构造函数”。分配器接口(interface)不能在 C++03 中执行后者。

我想你可以这样写:

T *ra = allocator.allocate(1);
if (!is_pod<T>::value) {
// in C++03
allocator.construct(ra, T());
// in C++11
allocator.construct(ra);
}

不过,is_pod 测试可能是错误的。检查标准以了解默认初始化什么都不做。显然 is_pod 在 C++03 中不存在,但我依稀记得 Boost 有某种适用于大多数实现的东西。

我认为您在这里反对设计。分配器接口(interface)是为容器使用而设计的。容器被设计为不包含未初始化的元素,因此它们对默认初始化没有用处。

关于c++ - 如何使用分配器精确模拟新的 T[n]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11626299/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com