操作符new
如果执行以下语句:
A* a = new A();
C++会执行以下两个步骤
1.调用operator new(这是一个函数,全局有一个定义,也可以在类中重载)分配内存。
2.调用A的构造函数。
类似的,操作符delete会先调用析构函数,再调用operator delete释放内存。
重载operator new
class A{ public: void* operator new(size_t size) { std::cout << "A::operator new" << std::endl; return malloc(size); } };
ps: 使用::operator new可以指定使用全局的operator new函数。
placement new
placement new事实上不分配内存,它会根据传入的ptr来构造对象。
1.预先分配内存
char * buff = new [sizeof(A)]; // 也可以在栈中分配
2.调用placement new构造对象
A *a = new (buf) A
ps:在使用完后记得手动释放内存跟调用相应的析构函数。