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

ano*_*non 25 c++ memory-management

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

我只想分配一块T.

我的标准方法是:

T* data = malloc(sizeof(T) * num);
Run Code Online (Sandbox Code Playgroud)

但是,我不知道(data + i)是否是T对齐的.此外,我不知道这是否是正确的"C++"方式.

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

AnT*_*AnT 25

首先,你没有分配"块T*".你正在分配一个"块T".

其次,如果你T有非平凡的构造函数,那么在构造元素之前,你的块实际上并不是"T块",而是一块原始内存.根本不涉及T这里(计算尺寸除外).甲void *指针是与原始内存更合适.

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

void *raw_data = malloc(num * sizeof(T));
Run Code Online (Sandbox Code Playgroud)

要么

void *raw_data = new unsigned char[num * sizeof(T)];
Run Code Online (Sandbox Code Playgroud)

要么

void *raw_data = ::operator new(num * sizeof(T));
Run Code Online (Sandbox Code Playgroud)

要么

std::allocator<T> a;
void *raw_data = a.allocate(num);
// or
// T *raw_data = a.allocate(num);
Run Code Online (Sandbox Code Playgroud)

之后,当你实际构造元素时(使用placement new,正如你所说),你最终会得到一个有意义的类型指针T *,但只要内存是原始的,使用T *就没有意义(尽管它不是错误) .

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

您可能实际上想要查看C++标准库提供的内存实用程序:std::allocator<>使用allocateconstruct方法,以及算法uninitialized_fill等,或者尝试重新发明轮子.

  • 我认为std :: allocator <>是"最C++"的做法 (4认同)

Jer*_*fin 6

返回来自malloc任何类型,因此这不是问题.

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