C ++:在不调用构造函数的情况下分配T块

时间:2010-03-04 21:44:01

标签: c++ memory-management

我不想要构造函数调用。我正在使用新的展示位置。

我只想分配一个T块。

我的标准方法是:

T* data = malloc(sizeof(T) * num);

然而,我不知道(data + i)是否是T对齐的。此外,我不知道这是否是正确的“C ++”方式。

如何在不调用构造函数的情况下分配T块?

3 个答案:

答案 0 :(得分:25)

首先,您没有分配“T*块”。您正在分配“T块”。

其次,如果您的T具有非平凡的构造函数,那么在构造元素之前,您的块实际上不是“T块”,而是一块原始内存。在这里涉及T没有意义(计算大小除外)。 void *指针更适合原始内存。

要分配内存,您可以使用任何您喜欢的内容

void *raw_data = malloc(num * sizeof(T));

void *raw_data = new unsigned char[num * sizeof(T)];

void *raw_data = ::operator new(num * sizeof(T));

std::allocator<T> a;
void *raw_data = a.allocate(num);
// or
// T *raw_data = a.allocate(num);

稍后,当你实际构造元素时(使用placement new,如你所说),你最终会得到一个类型为T *的有意义的指针,但只要内存是raw,就使用{{1没有意义(虽然这不是错误)。

除非T *有一些奇特的对齐要求,否则上述分配函数返回的内存将正确对齐。

您可能真的想看一下C ++标准库提供的内存实用程序:T使用std::allocator<>allocate方法,算法作为construct等。相反或试图重新发明轮子。

答案 1 :(得分:6)

malloc的回复符合任何类型,因此不是问题。

通常在C ++中,::operator new将是首选方式。您也可以考虑使用Allocator<T>,它提供了一些额外的灵活性(比如能够轻松切换分配器。

答案 2 :(得分:1)

T* data = reinterpret_cast<T*>(operator new(sizeof(T) * num));

或者只使用std::vector<T>并且不要担心这些低级内存细节;)