理解不同含义的NEW和DELETE
原则:可以改变New的实现方式,但是改变不了New要实现什么。
分类:
a. new /new[] (new operator);
b. operator new/operator new[]
c. placement new
区别
- new operator
new operator是语言内置的,不可改变;
new operator的实现分两步:a. 调用operator new来分配内存(raw); b. 调用对象的构造函数,在a分配的内存上构建对象并返回对象指针。
想在堆上建立对象必须使用new operator; - operator new
void * operator new(size_t size);
operator new函数可以被重载,但第一个参数必须是size_t。重载operator new后,将影响new operator;
3. placement new
placement new 在已经存在的内存上建立对象
void * operator new(size_t, void *location)
{
return location;
}
class Widget {
public:
Widget(int widgetSize);
...
};
Widget * constructWidgetInBuffer(void *buffer,
int widgetSize) {
return new (buffer) Widget(widgetSize);
}
new 和 delete 操作符是内置的,其行为不受你的控制,凡是它们调用的内存分配和释
放函数则可以控制。