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()
的。