new操作符(new operator) 和 new 操作(operator new)和operator new[]
new操作符,完成功能的行为分两部分:
1.先分配对象所占用的内存。
2.再调用构造函数初始化内存里的对象。
不能以任何形式改变new操作符的行为,但能改变其如何分配内存,new操作符调用operator new()
函数内存分配,可重写此函数改变其行为。
eg: int *a = new int(100);
void* operator new(size_t sz);//参数类型size_t决定分配多少内存,sz = sizeof(size_t),并返回一个未经过处理的指针指向未初始化的内存,再调用构造函数,初始化内存。上例则分配int类型大小4个字节,内存初始化为100.
可对operator new(size_t sz)函数进行重写,改变其分配内存空间的大小。假设分配大小为9 的字节:
eg: void* operator new(size_t sz)
{
return (void*)malloc(sz+5);
}
但直接调用operator new函数时,例如 void * p = operator new (4);
//此函数即如同malloc函数一样,只分配了4个内存大小的空间,返回一个未经处理的指针,对构造函数全然不知。所以说 operator new()只是内存分配函数
int *a = new int[100];
用void* operator new[](size_t sz);//分配sz=sizeof(size_t)*100大小内存,返回一个未经处理的指针指向未初始化的内存。不调构造函数,不初始化内存。申请内存时会多申请4字节空间存放分配单元的个数。
可对operator new[](size_t sz)函数进行重写控制分配内存空间的大小。
用delete[]进行释放,释放时根据4字节空间里存放的个数进行依次释放。也可对operator delete()进行重载,定制删除器。
int *a = new int[100]( );//对申请单元空间进行初始化,默认初始化为0,。