多多色-多人伦交性欧美在线观看-多人伦精品一区二区三区视频-多色视频-免费黄色视屏网站-免费黄色在线

國內(nèi)最全I(xiàn)T社區(qū)平臺 聯(lián)系我們 | 收藏本站
阿里云優(yōu)惠2
您當(dāng)前位置:首頁 > php開源 > php教程 > [置頂] malloc和new的區(qū)別

[置頂] malloc和new的區(qū)別

來源:程序員人生   發(fā)布時間:2014-12-23 08:39:20 閱讀次數(shù):4323次

在申請分配動態(tài)內(nèi)存時,malloc和new1直都困擾著程序員,今天就作個簡單的對照,找到它們的區(qū)分:

1、主要區(qū)分

1,malloc與free是C++/C語言的標(biāo)準(zhǔn)庫函數(shù),new/delete是C++的運算符。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。

2,對非內(nèi)部數(shù)據(jù)類型的對象而言,光用maloc/free沒法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時要自動履行構(gòu)造函數(shù),對象在滅亡之前要自動履行析構(gòu)函數(shù)。由于malloc/free是庫函數(shù)而不是運算符,不在編譯器控制權(quán)限以內(nèi),不能夠把履行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于malloc/free。

3,因此C++語言需要1個能完成動態(tài)內(nèi)存分配和初始化工作的運算符new,以1個能完成清算與釋放內(nèi)存工作的運算符delete。注意new/delete不是庫函數(shù)。

4,C++程序常常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動態(tài)內(nèi)存,new 是個操作符,和甚么"+","-","="...有1樣的地位. malloc是個分配內(nèi)存的函數(shù),供你調(diào)用的.

new是保存字,不需要頭文件支持.malloc需要頭文件庫函數(shù)支持.new 建立的是1個對象,malloc分配的是1塊內(nèi)存.

簡單的說: malloc,free是c的函數(shù),而new,delete是c++的運算符 。另外,new是強(qiáng)迫類型的,malloc不是,需要類型轉(zhuǎn)換 ,固然還有很多不同: new 可以調(diào)用構(gòu)造函數(shù)在聲明的時候初始化,而 malloc只是分配空間,需要在其他地方初始化 ;delete不但會釋放空間,在釋放前會調(diào)用析構(gòu)函數(shù) ,而且malloc需要指定分配空間大小, 而new是自動計算的 。
 

注意free()釋放的是指針指向的內(nèi)存!注意!釋放的是內(nèi)存,不是指針!這點非常非常重要!指針是1個變量,只有程序結(jié)束時才被燒毀。釋放了內(nèi)存空間后,原來指向這塊空間的指針還是存在!只不過現(xiàn)在指針指向的內(nèi)容的垃圾,是未定義的,所以說是垃圾。因此,前面我已說過了,釋放內(nèi)存后把指針指向NULL,避免指針在后面不謹(jǐn)慎又被解援用了。

2、扼要分析

1、malloc函數(shù)

1.1 malloc的全稱是memory allocation,中文叫動態(tài)內(nèi)存分配。
原型:extern void *malloc(unsigned int num_bytes); 
說明:分配長度為num_bytes字節(jié)的內(nèi)存塊。如果分配成功則返回指向被分配內(nèi)存的指針,分配失敗返回空指針NULL。當(dāng)內(nèi)存不再使用時,應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。

1.2 void *malloc(int size); 
說明:malloc 向系統(tǒng)申請分配指定size個字節(jié)的內(nèi)存空間,返回類型是 void* 類型。void* 表示未肯定類型的指針。C,C++規(guī)定,void* 類型可以強(qiáng)迫轉(zhuǎn)換為任何其它類型的指針。   
備注:void* 表示未肯定類型的指針,更明確的說是指申請內(nèi)存空間時還不知道用戶是用這段空間來存儲甚么類型的數(shù)據(jù)(比如是char還是int或...)

1.3 free
void free(void *FirstByte): 該函數(shù)是將之前用malloc分配的空間還給程序或是操作系統(tǒng),也就是釋放了這塊內(nèi)存,讓它重新得到自由。

1.4注意事項

1)申請了內(nèi)存空間后,必須檢查是不是分配成功
2)當(dāng)不需要再使用申請的內(nèi)存時,記得釋放;釋放后應(yīng)當(dāng)把指向這塊內(nèi)存的指針指向NULL,避免程序后面不謹(jǐn)慎使用了它。 
3)這兩個函數(shù)應(yīng)當(dāng)是配對。如果申請后不釋放就是內(nèi)存泄漏;如果無故釋放那就是甚么也沒有做。釋放只能1次,如果釋放兩次及兩次以上會出現(xiàn)毛病(釋放空指針例外,釋放空指針其實也等于啥也沒做,所以釋放空指針釋放多少次都沒有問題)。
4)雖然malloc()函數(shù)的類型是(void *),任何類型的指針都可以轉(zhuǎn)換成(void *),但是最好還是在前面進(jìn)行強(qiáng)迫類型轉(zhuǎn)換,由于這樣可以躲過1些編譯器的檢查。

1.5  malloc()到底從哪里得到了內(nèi)存空間?

答案是從堆里面取得空間。也就是說函數(shù)返回的指針是指向堆里面的1塊內(nèi)存。操作系統(tǒng)中有1個記錄空閑內(nèi)存地址的鏈表。當(dāng)操作系統(tǒng)收到程序的申請時,就會遍歷該鏈表,然后就尋覓第1個空間大于所申請空間的堆結(jié)點,然后就將該結(jié)點從空閑結(jié)點鏈表中刪除,并將該結(jié)點的空間分配給程序。

2、new運算符

2.1 C++中,用new和delete動態(tài)創(chuàng)建和釋放數(shù)組或單個對象

動態(tài)創(chuàng)建對象時,只需指定其數(shù)據(jù)類型,而沒必要為該對象命名,new表達(dá)式返回指向該新創(chuàng)建對象的指針,我們可以通過指針來訪問此對象
int *pi=new int;
這個new表達(dá)式在堆區(qū)中分配創(chuàng)建了1個整型對象,并返回此對象的地址,并用該地址初始化指針pi 。

2.2 動態(tài)創(chuàng)建對象的初始化

動態(tài)創(chuàng)建的對象可以用初始化變量的方式初始化。
int *pi=new int(100); //指針pi所指向的對象初始化為100
string *ps=new string(10,’9’);//*ps 為“9999999999”

如果不提供顯示初始化,對類類型,用該類的默許構(gòu)造函數(shù)初始化;而內(nèi)置類型的對象則無初始化
也能夠?qū)討B(tài)創(chuàng)建的對象做值初始化:
int *pi=new int( );//初始化為0
int *pi=new int;//pi 指向1個沒有初始化的int
string *ps=new string( );//初始化為空字符串 (對提供了默許構(gòu)造函數(shù)的類類型,沒有必要對其對象進(jìn)行值初始化)

2.3 撤消動態(tài)創(chuàng)建的對象

delete表達(dá)式釋放指針指向的地址空間。
delete pi ;// 釋放單個對象
delete [ ]pi;//釋放數(shù)組
如果指針指向的不是new分配的內(nèi)存地址,則使用delete是不合法的。

2.4 在delete以后,重設(shè)指針的值

delete p; //履行完該語句后,p變成了不肯定的指針,在很多機(jī)器上,雖然p值沒有明肯定義,但依然寄存了它之前所指對象的地址,然后p所指向的內(nèi)存已被釋放了,所以p不再有效。此時,該指針變成了懸垂指針(懸垂指針指向曾寄存對象的內(nèi)存,但該對象已不存在了)。懸垂指針常常致使程序毛病,而且很難檢測出來。
1旦刪除指針?biāo)傅膶ο螅⑿袑⒅羔樦脼?,這樣就非常清楚的指明指針不再指向任何對象。(零值指針:int *ip=0;)

2.5 辨別零值指針和NULL指針

零值指針,是值是0的指針,可以是任何1種指針類型,可以是通用變體類型void*也能夠是char*,int*等等。
空指針,其實空指針只是1種編程概念,就如1個容器可能有空和非空兩種基本狀態(tài),而在非空時可能里面存儲了1個數(shù)值是0,因此空指針是人為認(rèn)為的指針不提供任何地址訊息。

2.6 new分配失敗時,返回甚么?

1993年前,c++1直要求在內(nèi)存分配失敗時operator   new要返回0,現(xiàn)在則是要求operator   new拋出std::bad_alloc異常。很多c++程序是在編譯器開始支持新規(guī)范前寫的。c++標(biāo)準(zhǔn)委員會不想放棄那些已有的遵守返回0規(guī)范的代碼,所以他們提供了另外情勢的operator   new(和operator   new[])以繼續(xù)提供返回0功能。這些情勢被稱為“無拋出”,由于他們沒用過1個throw,而是在使用new的入口點采取了no throw對象
class   widget   {   ...   };

widget   *pw1   =   new   widget;//   分配失敗拋出std::bad_alloc  

if   (pw1   ==   0)   ... //   這個檢查1定失敗

widget   *pw2   =   new   (nothrow)   widget;   //   若分配失敗返回0

if   (pw2   ==   0)   ... //   這個檢查可能會成功

3. malloc和new的區(qū)分

3.1 new 返回指定類型的指針,并且可以自動計算所需要大小。
比如:   
1) int *p;   
p = new int; //返回類型為int* 類型(整數(shù)型指針),分配大小為 sizeof(int);   
或:   
int* parr;   
parr = new int [100]; //返回類型為 int* 類型(整數(shù)型指針),分配大小為 sizeof(int) * 100;   
2) 而 malloc 則必須要由我們計算字節(jié)數(shù),并且在返回后強(qiáng)行轉(zhuǎn)換為實際類型的指針。   
int* p;   
p = (int *) malloc (sizeof(int)*128);//分配128個(可根據(jù)實際需要替換該數(shù)值)整型存儲單元,并將這128個連續(xù)的整型存儲單元的首地址存儲到指針變量p中  
double *pd=(double *) malloc (sizeof(double)*12);//分配12個double型存儲單元,并將首地址存儲到指針變量pd中

3.2 malloc 只管分配內(nèi)存,其實不能對所得的內(nèi)存進(jìn)行初始化所以得到的1片新內(nèi)存中,其值將是隨機(jī)的
除分配及最后釋放的方法不1樣之外,通過malloc或new得到指針,在其它操作上保持1致。

4.有了malloc/free為何還要new/delete?

1) malloc與free是C++/C語言的標(biāo)準(zhǔn)庫函數(shù),new/delete是C++的運算符。它們都可用于申請動態(tài)內(nèi)存和釋放內(nèi)存。
2) 對非內(nèi)部數(shù)據(jù)類型的對象而言,光用maloc/free沒法滿足動態(tài)對象的要求。對象在創(chuàng)建的同時要自動履行構(gòu)造函數(shù),對象在滅亡之前要自動履行析構(gòu)函數(shù)。由于malloc/free是庫函數(shù)而不是運算符,不在編譯器控制權(quán)限以內(nèi),不能夠把履行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于malloc/free。
因此C++語言需要1個能完成動態(tài)內(nèi)存分配和初始化工作的運算符new,和1個能完成清算與釋放內(nèi)存工作的運算符delete。注意new/delete不是庫函數(shù)。
我們不要企圖用malloc/free來完成動態(tài)對象的內(nèi)存管理,應(yīng)當(dāng)用new/delete。由于內(nèi)部數(shù)據(jù)類型的“對象”沒有構(gòu)造與析構(gòu)的進(jìn)程,對它們而言malloc/free和new/delete是等價的。
3) 既然new/delete的功能完全覆蓋了malloc/free,為何C++不把malloc/free淘汰出局呢?這是由于C++程序常常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動態(tài)內(nèi)存。
如果用free釋放“new創(chuàng)建的動態(tài)對象”,那末該對象因沒法履行析構(gòu)函數(shù)而可能致使程序出錯。如果用delete釋放“malloc申請的動態(tài)內(nèi)存”,結(jié)果也會致使程序出錯,但是該程序的可讀性很差。所以new/delete必須配對使用,malloc/free也1樣。



生活不易,碼農(nóng)辛苦
如果您覺得本網(wǎng)站對您的學(xué)習(xí)有所幫助,可以手機(jī)掃描二維碼進(jìn)行捐贈
程序員人生
------分隔線----------------------------
分享到:
------分隔線----------------------------
關(guān)閉
程序員人生
主站蜘蛛池模板: www.伊人.com | 一级毛片在线观看视频 | 免费的黄色的网站 | 欧美另类xxxxhd高清 | 国产香蕉偷在线观看视频 | 亚洲精品视频在线观看视频 | 日本特黄特色大片免费播放视频 | 操人网站 | 国产永久高清免费动作片www | 亚洲欧美偷拍另类 | 国产片欧美片亚洲片久久综合 | 欧美 日韩 国产 成人 在线观看 | 在线观看一区二区三区视频 | 欧美一区二三区 | 欧美一级淫片aaaaaaa视频 | 欧美一级爱爱视频 | 国产精品99久久久久久夜夜嗨 | 男女激情视频软件 | 欧美在线高清 | 2020亚洲天堂 | 亚洲大片免费观看 | 亚洲在线播放视频 | 久草在线免费福利资源 | 在线成人免费观看国产精品 | 114毛片免费观看网站 | 国产女人视频免费观看 | 91久久国产综合精品 | freexxx性韩国 | 一区自拍 | adc欧美成人影院 | 18欧美乱大交 | 黑人和黑人激情一级毛片 | 亚洲免费视频网 | 亚洲精品伊人 | 国产亚洲人成网站在线观看 | 国产亚洲精品自在久久不卡 | 乌克兰鲜嫩xxxx | 亚洲人成网站在线观看播放 | 久久国产综合 | 欧美一级欧美一级在线播放 | 一区二区三区 亚洲区 |