国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學(xué)院 > 開發(fā)設(shè)計 > 正文

new/delete與new[]/delete[]實現(xiàn)機(jī)制

2019-11-08 02:41:58
字體:
供稿:網(wǎng)友

new和delete是C++新引入的單目運(yùn)算符,它們可以從堆上分配和刪除存儲塊(堆在C++中也叫自由存儲).用new運(yùn)算符(不是函數(shù))時要指明數(shù)據(jù)類型,以后new就分配一個足以放下指明類型對象的存儲,并返回該存儲塊的首地址作為指向指定類型的指針.

1. new/new[]:完成兩件事,先底層調(diào)用malloc分了配內(nèi)存,然后創(chuàng)建一個對象(調(diào)用構(gòu)造函數(shù))。

2. delete/delete[]:也完成兩件事,先調(diào)用析構(gòu)函數(shù)(清理資源),然后底層調(diào)用free釋放空間。

3. new在申請內(nèi)存時會自動計算所需字節(jié)數(shù),而malloc則需我們自己輸入申請內(nèi)存空間的字節(jié)數(shù)。

new/delete,new[]/delete[],malloc/free必須配對使用。

在此假設(shè)我們已經(jīng)創(chuàng)建了一個data類,以下是new/delete,delete/delete[]底層實現(xiàn)機(jī)制。

常見的new與delete錯誤解析:

//data *p = newdata;

   //delete p;//標(biāo)準(zhǔn)用法,調(diào)用析構(gòu)函數(shù)之后并釋放了所申請的內(nèi)存空間

   //free(p);//不提倡,雖然可以釋放,但是沒調(diào)用析構(gòu)函數(shù)

   //delete[]p;錯誤,程序崩潰,因為delete釋放空間是從new出來的空間真正起始地址處(new出來返回的指正變量p并不是在空間的真正起始處,而是在真正起始處偏移若干字節(jié)處)而釋放時,在new出來的空間正真起始處開始釋放,釋放的空間超過了原來p所指向的地址處,所以程序會崩潰*/

   //data *p1 = newdata[2];

   //delete p1;//若顯式給出了析構(gòu)函數(shù),則錯誤,創(chuàng)建了兩個對象的存儲空間,而只釋放了一個,內(nèi)存泄漏,若沒有顯式析構(gòu)函數(shù),則能編譯通過(不提倡)

   //free(p1);//錯誤,程序直接崩潰,沒掉析構(gòu)函數(shù),而且分配的內(nèi)存與釋放的內(nèi)存不匹配

   //delete[]p1;//正確,必須配對使用假設(shè)

Sizeof(data/data[2]):

假設(shè)data類對象大小為12字節(jié),若顯式定義了析構(gòu)函數(shù),則new data[2]大小為28字節(jié),則會多申請4字節(jié)的空間保存deta類對象的個數(shù)(count=2),若沒有顯式定義析構(gòu)函數(shù),則new data[2]大小24字節(jié)。

 


發(fā)表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發(fā)表
主站蜘蛛池模板: 镇雄县| 邯郸市| 虎林市| 文昌市| 象州县| 于田县| 清河县| 陕西省| 巴彦淖尔市| 周宁县| 天全县| 碌曲县| 邓州市| 长武县| 鄯善县| 紫阳县| 通辽市| 浪卡子县| 祥云县| 中方县| 宝应县| 类乌齐县| 绥棱县| 周至县| 柳林县| 临朐县| 大化| 合肥市| 桐梓县| 和田市| 洪雅县| 大邑县| 上林县| 塔城市| 改则县| 滨海县| 夏邑县| 涪陵区| 新蔡县| 滨海县| 同德县|