new and malloc

Posted by keming on August 2, 2021

new的过程

  • 经典两步:
    • 申请
    • 构造
  • 如果想跳过申请,使用placement new。

重写new

  • 正常重写的代码如下,可以在类内,也可以重写全局的。
static void *operator new([[maybe_unused]] size_t);
static void *operator new[](size_t) = delete;
static void operator delete(void *ptr, [[maybe_unused]] size_t);
static void operator delete[](void *, size_t) = delete;
  • 返回值是void *,入参size_t是malloc的大小。
  • 有趣的事情来了,调用构造函数的地方在哪里呢??
    • 你会发现,实现里面写个malloc就可以,构造函数会被自动调用。
    • 猜测构造函数是编译器调的,在我们重写这个new实现的调用之后发生。

其他场景

  • 对于其他不重写new的场景,比如提供一个T *CreateObject()接口,是需要显式调用构造函数T()的。