和 sizeof 類似,sizeof不是函數,它是一個操作符,它在編譯期就完成了計算,在函數運行期間它已經是一個常數值了。
new 和 delete 也不是函數,它們都是 C++ 定義的關鍵字,通過特定的語法可以組成表達式。和 sizeof 不同的是,sizeof 在編譯時候就可以確定其返回值,new 和 delete 背后的機制則比較復雜。
?
string *ps = new string("hello world");
你就可以看出 new 和 malloc 還是有點不同的,malloc 申請完空間之后不會對內存進行必要的初始化,而 new 可以。
?
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 申請內存之后不對內存進行初始化,直接返回申請內存的指針。
?
如何申請和釋放一個數組?
string *psa = new string[10]; //array of 10 empty strings int *pia = new int[10];
上面在申請一個數組時都用到了?new []
?這個表達式來完成,按照我們上面講到的 new 和 delete 知識,第一個數組是 string 類型,分配了保存對象的內存空間之后,將調用 string 類型的默認構造函數依次初始化數組中每個元素;第二個是申請具有內置類型的數組,分配了存儲 10 個 int 對象的內存空間,但并沒有初始化。
delete [] psa;
delete [] pia;
都用到?delete []
?表達式,注意這地方的 [] 一般情況下不能漏掉!我們也可以想象這兩個語句分別干了什么:第一個對 10 個 string 對象分別調用析構函數,然后再釋放掉為對象分配的所有內存空間;第二個因為是內置類型不存在析構函數,直接釋放為 10 個 int 型分配的所有內存空間。