new和delete

和 sizeof 相似,sizeof不是函數,它是一個操做符,它在編譯期就完成了計算,在函數運行期間它已是一個常數值了。數組

int a;
sizeof(int) = 4;
sizeof(a) = 4;
sizeof a ——也是4  不須要括號!
 
此時要注意:
sizeof int——錯誤!此時int  把sizeof當成int的修飾詞;好比  signed int ,  register int 。。。

new 和 delete 也不是函數,它們都是 C++ 定義的關鍵字,經過特定的語法能夠組成表達式。和 sizeof 不一樣的是,sizeof 在編譯時候就能夠肯定其返回值,new 和 delete 背後的機制則比較複雜。函數

 

string *ps = new string("hello world"); 

你就能夠看出 new 和 malloc 仍是有點不一樣的,malloc 申請完空間以後不會對內存進行必要的初始化,而 new 能夠。spa

 

operator new 和 operator delete

這兩個實際上是 C++ 語言標準庫的庫函數,原型分別以下:指針

void *operator new(size_t); //allocate an object void *operator delete(void *); //free an object void *operator new[](size_t); //allocate an array void *operator delete[](void *); //free an array 

後面兩個你能夠先不看,後面再介紹。前面兩個均是 C++ 標準庫函數,你可能會以爲這是函數嗎?請不要懷疑,這就是函數!C++ Primer 一書上說這不是重載 new 和 delete 表達式(如 operator= 就是重載 = 操做符),由於 new 和 delete 是不容許重載的。但我還沒搞清楚爲何要用 operator new 和 operator delete 來命名,比較費解。咱們只要知道它們的意思就能夠了,這兩個函數和 C 語言中的 malloc 和 free 函數有點像了,都是用來申請和釋放內存的,而且 operator new 申請內存以後不對內存進行初始化,直接返回申請內存的指針。code

 

如何申請和釋放一個數組?

string *psa = new string[10]; //array of 10 empty strings int *pia = new int[10]; 
上面在申請一個數組時都用到了  這個表達式來完成,按照咱們上面講到的 new 和 delete 知識,第一個數組是 string 類型,分配了保存對象的內存空間以後,將調用 string 類型的默認構造函數依次初始化數組中每一個元素;第二個是申請具備內置類型的數組,分配了存儲 10 個 int 對象的內存空間,但並無初始化。
new []
delete [] psa; delete [] pia;
都用到  表達式,注意這地方的 [] 通常狀況下不能漏掉!咱們也能夠想象這兩個語句分別幹了什麼:第一個對 10 個 string 對象分別調用析構函數,而後再釋放掉爲對象分配的全部內存空間;第二個由於是內置類型不存在析構函數,直接釋放爲 10 個 int 型分配的全部內存空間。delete []
相關文章
相關標籤/搜索