new operator = operator new + 构造函数
delete operator = 析构函数 + operator delete
new operator是由语言内建的,如sizeof一样,不能被改变意义,总是做相同的事。它的动作分为两方面:
- 分配足够的内存,用来放置某类型的对象。
- 调用一个constructor,为分配的内存中的对象设定初值。
这两件事是无法改变的
string *ps = new string("Memory Management");
// 编译器将其转换为类似如下行为
void *memory = operator new(sizeof(string));
call string::string("Memory Management") on *memory;
string *ps = static_cast<string*>(memory);
可以改变的是内存的分配行为。new operator调用函数operator new执行必要的内存分配动作,可以重写或重载该函数,改变其行为。
函数原型:
void* operator new(size_t size)
可以加上额外的参数重载operator new,但第一参数类型必须总是size_t。
有一个特殊版本的operator new称为placement new
使用方式:new (buffer) Widget(widgetSize);
实现类似如下:
void* operator new(size_t, void* location){
return location;
}