当malloc非平凡类型会发生什么?

时间:2014-08-03 17:45:55

标签: memory c++11 malloc typetraits

  

只有通过调用std :: malloc才能创建普通类型的对象(包括数组)。

我是在{em> Note 部分的http://en.cppreference.com/w/cpp/types/is_trivial下阅读的。 所以如果我有一个非平凡类型 T ,如果我使用std :: malloc(sizeof(T))会发生什么?

1 个答案:

答案 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!)