new operator是new函数,有以下两个过程
1. 调用operator new分配空间
2. 调用构造函数
其中operator new是可以被重载的,每一个类都可以重载自己的operator new
placement new可以解决没有默认构造函数的情况,也可以用来减少malloc的开销
placement new的用法如下
/// 首先调用operator new开出一块内存
void *p = ::operator new(sizeof(Foo));
/// 然后用placement new就可以调用带参数的构造函数
Foo *foo = new(p) Foo(1);
placement new带的参数是一个指针,这个指针指向了之前分配好的一块空间,用operator new就可以
它所做的事情就是返回这个指针,后面跟踪进去的时候不知道为什么进入了Foo的构造函数,很神奇!想知道原因大概要看汇编了,不明白为什么,但总之能够调用带参数的构造函数了
下面是测试代码
#include <new> #include <iostream> using namespace std; class Foo{ public: Foo(int i){ cout << i << endl; } }; int main(){ void *buff = ::operator new(128); Foo *foo = new(buff) Foo(1); return 0; }