1.內(nèi)存的分配方式有幾種?
- 從靜態(tài)存儲區(qū)域分配擒滑。內(nèi)存在程序編譯的時候就已經(jīng)分配好橘忱,這塊內(nèi)存在程序的整個運行期間都存在。例如全局變量颖御。
2 在棧上創(chuàng)建凝颇。在執(zhí)行函數(shù)時,函數(shù)內(nèi)局部變量的存儲單元都可以在棧上創(chuàng)建芦岂,函數(shù)執(zhí)行結(jié)束時這些存儲單元自動被釋放垫蛆。棧內(nèi)存分配運算內(nèi)置于處理器的指令集中,效率很高川无,但是分配的內(nèi)存容量有限。 - 從堆上分配晾虑,亦稱動態(tài)內(nèi)存分配仅叫。程序在運行的時候用malloc或new申請任意多少的內(nèi)存,程序員自己負責在何時用free或delete釋放內(nèi)存笙隙。動態(tài)內(nèi)存的生存期由我們決定,使用非常靈活婴渡,但問題也最多。
2. new哄尔,delete柠并,malloc,free關系
delete會調(diào)用對象的析構(gòu)函數(shù),和new對應鸣戴;free只會釋放內(nèi)存粘拾,new調(diào)用構(gòu)造函數(shù)缰雇。
malloc與free是C++/C語言的標準庫函數(shù),new/delete是C++的運算符疏之。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存暇咆。對于非內(nèi)部數(shù)據(jù)類型的對象而言丙曙,光用maloc/free無法滿足動態(tài)對象的要求河泳。對象在創(chuàng)建的同時要自動執(zhí)行構(gòu)造函數(shù)年栓,對象在消亡之前要自動執(zhí)行析構(gòu)函數(shù)。由于malloc/free是庫函數(shù)而不是運算符纸兔,不在編譯器控制權(quán)限之內(nèi)否副,不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務強加于malloc/free。因此C++語言需要一個能完成動態(tài)內(nèi)存分配和初始化工作的運算符new洲拇,以及一個能完成清理與釋放內(nèi)存工作的運算符delete曲尸。注意new/delete不是庫函數(shù)。
3.delete與 delete[] 區(qū)別
delete只會調(diào)用一次析構(gòu)函數(shù)纽乱,而delete[]會調(diào)用每一個成員的析構(gòu)函數(shù)昆箕。在More Effective C++中有更為詳細的解釋:“當delete操作符用于數(shù)組時,它為每個數(shù)組元素調(diào)用析構(gòu)函數(shù)鹏倘,然后調(diào)用operator delete來釋放內(nèi)存纤泵。”delete與new配套诲锹,delete []與new []配套
MemTest *mTest1=new MemTest[10];
MemTest *mTest2=new MemTest;
Int *pInt1=new int [10];
Int *pInt2=new int;
delete[]pInt1; //-1-
delete[]pInt2; //-2-
delete[]mTest1; //-3-
delete[]mTest2; //-4-
在-4-處報錯归园。
這就說明:對于內(nèi)建簡單數(shù)據(jù)類型,delete和delete[]功能是相同的庸诱。對于自定義的復雜數(shù)據(jù)類型,delete和delete[]不能互用桥爽。delete[]刪除一個數(shù)組钠四,delete刪除一個指針。簡單來說缀去,用new分配的內(nèi)存用delete刪除;用new[]分配的內(nèi)存用delete[]刪除褥影。delete[]會調(diào)用數(shù)組元素的析構(gòu)函數(shù)凡怎。內(nèi)部數(shù)據(jù)類型沒有析構(gòu)函數(shù)赊抖,所以問題不大。如果你在用delete時沒用括號熏迹,delete就會認為指向的是單個對象注暗,否則墓猎,它就會認為指向的是一個數(shù)組。
4.C++有哪些性質(zhì)(面向?qū)ο筇攸c)
封裝骗卜,繼承和多態(tài)左胞。
5.子類析構(gòu)時要調(diào)用父類的析構(gòu)函數(shù)嗎?
析構(gòu)函數(shù)調(diào)用的次序是先派生類的析構(gòu)后基類的析構(gòu)遍烦,也就是說在基類的的析構(gòu)調(diào)用的時候,派生類的信息已經(jīng)全部銷毀了服猪。定義一個對象時先調(diào)用基類的構(gòu)造函數(shù)、然后調(diào)用派生類的構(gòu)造函數(shù)罢猪;析構(gòu)的時候恰好相反:先調(diào)用派生類的析構(gòu)函數(shù)、然后調(diào)用基類的析構(gòu)函數(shù)膳帕。