l new操作符(new operator)
string *ps = new string(“Memory Management”);
這里的new是由語言內建的,我們成為new關鍵字。new操作符做了兩件事情:
1、在堆上分配足夠的內存,用來放置某類型的對象;使用operator new進行內存空間分配。
2、調用constructor構造函數,為剛剛分配的內存空間設置初值。
new操作符的行為是語言內建的,無法對其行為進行改變。
l new函數(operator new)
聲明如下:
void * operator new(size_t size);//是不是很像C中的malloc。
是的,我們可以將operator new函數類比於C中的malloc函數。
operator new只做了一件事情,就是分配內存空間,但是沒有構造函數,也就是沒有完成對分配空間的初始值設定。但是operator new可以重載。
所以在使用operator new之后一般接下來會對分配的內存空間進行初值設定。
char *memory = (char*) operator new(sizeof(char)*15);//類似於malloc
strcpy(memory, “hello world”);
l Placement new:在已分配的內存(堆和棧)中構造對象
new (buffer) type(size_t size);
int data = 123456;
int *pa = new(&data) int;//pa指針將指向data對象,里面的內容與data保持一致,沒有進行覆蓋。
int *pb = new(&data) int(123);//pb指針同樣指向data對象,里面的內容將用123進行覆蓋。
l delete釋放內存,調用類的析構函數
delete p;//or delete [] p;
調用delete后,只是告訴了系統被delete掉的地址空間可以進行重新分配了。但是並未將p中的地址清除,也就是在delete后使用*p還是能夠得到內容,但是其中的內容就不可以預測了,可能系統重新將之前的內存空間分配出去,並設置了其他的值。所以在delete之后我們一般會將對應的delete對象設置為null。
delete p;
p = null;
l delete函數(operator delete)
p->~string();
operator delete(p);
最后一步也是講p重置為null,不過這步可以在析構函數中完成。