C++ new 和 delete


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,不過這步可以在析構函數中完成。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM