記得一次面試被問到new和malloc的區別,答曰:new是一個操作符,malloc是一個函數。面試官曰:也就是沒有區別是吧!暈,難道我說的不是區別嗎?看來我沒有說到他想聽到的東西。也罷,平常書讀的少了,思考的也不多,對這些問題總是說不到本質上去。所以勵志讀遍IT界的大牛神書,多多的思考,多多的實踐!
malloc和free是C語言中提供我們用於堆內存分配的庫函數,那時還沒有C++的構造函數,析構函數的概念,也就對它們一無所知。
欲取得10個string對象所形成的數組空間,有兩種方法
string *stringArray1 = static_cast<string*>(malloc(10*sizeof(string)));
string *stringArray2 = new string[10];
兩者的區別是stringArray1將指向能夠放置10個string對象的內存空間,但其中沒有任何對象被初始化。
stringArray2指向由10個構造妥當的string對象所構成的數組,每一個元素都可以被安全的運用於任何需要string的行動上。
在釋放到內存時我們會這樣做:
free(stringArray1);
delete [] stringArray2;
free會釋放掉stringArray1所指的內存,但不會調用其中的string對象的destructors。要命的地方在於如果string對象本身亦配置有內存,那麼那些內存就全部遺失了。但如果以delete施加於stringArray2身上,在內存被釋放之前,數組中的每一個對象的destructor都會被調用一遍。
最後需要注意的是new/deelte,malloc/free要配對,切忌混用。混用時會有“未定義”的錯誤。
所謂“未定義”的意思是:它在開發階段沒有問題,它在測試階段沒有問題,但是它會在你最重要的客戶面前突然爆發。