new operator和 operator new的区别
通常我们使用的new是new operator。不能改变其意义。new operator做两件事。1、分配足够放置对象的内存。2、调用一个constructor,为刚才分配的内存中那个对象设定初值。
operator new的声明如下: void *operator new(size_t size); 我们可以重载这个new。而这个函数所做的事是执行必要的内存分配动作。
简单的说就是new operator在第一步调用operator new,而后第二步调用constructor。
例如:string *ps = new string("ha ha");
则产生的行为如下:
void *memory = operator new(sizeof(string));
call string::string("ha ha");
static_cast<string *>(memory);
Placement new
对已经分配好的内存中构造对象。
Widget *ConstructWidgeInBuffer(void *buffer, int widgetSize)
{
return new (buffer) Widget(widgetSize); //在buffer这块内存中构造对象
}
删除与内存释放
string *ps; delete ps;
会造成编译器产生近似这样的代码:
ps->~string();
operator delete(ps);
void *buffer = operator new(50*sizeof(char));
... operator delete(buffer);
这组行为相当于调用malloc和free。
数组
string *ps = new string[10];
新版的编译器会加入operator new[]这一特性,主要是因为operator new只会调用一次constructor,new []会为每一个对象调用constructor。
总结
new operator和delete operator都是内建操作符,无法为你所控制,但可以定制内存分配\释放函数。