只有通过调用std :: malloc才能创建普通类型的对象(包括数组)。
我是在{em> Note 部分的http://en.cppreference.com/w/cpp/types/is_trivial下阅读的。 所以如果我有一个非平凡类型 T ,如果我使用std :: malloc(sizeof(T))会发生什么?
答案 0 :(得分:2)
std::malloc
只是旧C(非C ++)函数malloc(3)的“重命名”。
因此,如果成功,它malloc(sizeof(T))
将返回一个指向{em>未初始化内存区域的指针,该内存区域的大小为T
您需要在该内存区域调用T
的一些构造函数。您可以将placement new用于此目的,例如:
void* p = std::malloc(sizeof(T));
if (!p) throw your_out_of_memory_exception();
T* ptr = new(p) T(32); /// placement new, with constructor called with 32
实际上,许多C ++实现的标准::operator new
做了类似的事情。 (所以new
调用malloc
!)