C++ 的new有三步: 调用运算符 new, 分配内存operator new, 调用构造函数 new(ptr) constructor.
1 - 运算符 new 不可以重载: 所以 void* operator new() { } 是无法通过编译的。
2 - 分配内存的new(size_t) 是唯一可以重载的: void* operator new(size_t size) { return malloc(size); } ;
3 - constructor new: 调用构造函数,这一步可以不通过new运算符调用, 你可以手动malloc一个内存,然后constructor new去构造一个对象。
例如:
void* operator new(size_t size) { cout<<"my operator new \n"; return malloc(size); } ; //可以做些额外的工作,如统计内存使用
void* operator new(size_t size, int a, int b, int c) { ...}; //还可以带些我们自己想要的参数,一般__FILE__,__LINE__比较多, 调用时写法时这样的:constructor* p = new(a,b,c) constructor;
int main()
{
int* p1 = new int; //输出 “my operator new” //根据对象类型优先调用类型内部定义的 class::operator new,
//没找到再使用全局的::operator new;
char* p2 = new char; //输出 “my operator new”
//可以有如下不一般的操作, 把new的步骤分开一步步自己走
int* p3 = ::operator new(4); //分配内存(直接拿来当int使用也是没问题,毕竟都是4字节)
new(p3) int ; //或者有带参数的构造函数时 new(p3) your_class( args);
// new ( ptr ) constructor ; 在内存池的应用上比较广泛,需要掌握
char* p4 = new(1,2,3) char; //或者 char *p4 = operator new(sizeof(char), 1,2,3); new(p4) char;
}
注意:new(ptr) 【数组】; 当用于数组的初始化构造时,ptr的内存必须要比实际数组大小要大4字节,这是数组用来记录数组大小的额外空间,容易掉坑