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

时间:2012-07-24 07:43:38

标签: c++ initialization allocator

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

如何使用allocator

复制此初始化行为
struct Foo
{
    int x;
    Foo() : x(1)
        { }
};

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

1 个答案:

答案 0 :(得分:3)

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

你要求默认初始化,这意味着(大约),“要么什么都不做,要么调用默认的构造函数”。分配器接口不能在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测试可能是错误的。检查标准,确切地说默认初始化什么都不做。显然{C> 03中不存在is_pod,但我模糊地回忆起Boost有一些适用于大多数实现的东西。

我认为你在这里与设计作斗争。分配器接口设计用于容器。容器的设计不包含未初始化的元素,因此它们不能用于默认初始化。