【问题标题】:What will happen when malloc non-trivial type?当 malloc 非平凡类型时会发生什么?
【发布时间】:2014-08-03 17:45:55
【问题描述】:

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

我从http://en.cppreference.com/w/cpp/types/is_trivial 读到它,位于Note 部分。 所以如果我有一个非平凡的类型 T,如果我使用 std::malloc( sizeof(T) ) 会发生什么?

【问题讨论】:

  • 你得到了很好的存储空间来存储一个T。它实际上应该说的是,只有普通类型的对象不需要构造。
  • 我更正了链接参考。

标签: memory c++11 malloc typetraits


【解决方案1】:

std::malloc 只是旧 C(不是 C++)函数malloc(3) 的“重命名”。

所以如果它成功了,它malloc(sizeof(T))会返回一个指针,指向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 !)

【讨论】:

    猜你喜欢
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 1970-01-01
    • 2021-07-20
    • 2016-09-15
    • 1970-01-01
    相关资源
    最近更新 更多