1. new operator (new操作符)
1) 分配空间 调用operator new
2) 调用构造函数
Sample:
string * ps = new string("Memory");
2. operator new
完全申明
void* operator new(size_t size);
只负责分配内存,不知道有构造函数存在
void* ps = operator new(sizeof(string));
void* memory = operator new(sizeof(string));
call string::string("Memory"); // dev不允许直接调用构造函数
string* ps = static_cast<string*>(memory);
3. placement new
在一个已经分配完毕的空间中构造对象
void* operator new(size_t , void* location)
{
return location;
}
Widget * constructWidgetInBuffer(void *buffer, int widgetSize)
{
return new (buffer) Widget(widgetSize);
}
1)如果想在堆上建立一个对象,应该用new操作符。它既分配内存又为对象调用构造函数。
2)如果仅仅想分配内存,就应该调用operator new函数;它不会调用构造函数。
3)如果你想定制自己的在堆对象被建立时的内存分配过程,你应该写你自己的operator new函数,然后使用new操作符,new操作符会调用你定制的operator new.
4)如果你想在一块已经获得指针的内存里建立一个对象,应该用placement new.
4. delete operation
1)调用析构函数
2)调用operator delete释放内存
得delete ps;
5. operator delete
完全申明
void operator delete(void* memToBeDeallocated);
new 和 delete应该对应
operator new和operator delete应该对应
placement new和 调用析构函数应该对应 (不应该释放内存)
6. new[]
string* ps = new string[10];
1)operator new[]被调用,分配数组需要的空间
2)每个string对象的默认构造函数被调用
7. delete []
delete [] ps;
1)调用每个string 对象的析构函数
2)释放整个数组的空间
new[] 和delete[]必须对应