日本黄色一级经典视频|伊人久久精品视频|亚洲黄色色周成人视频九九九|av免费网址黄色小短片|黄色Av无码亚洲成年人|亚洲1区2区3区无码|真人黄片免费观看|无码一级小说欧美日免费三级|日韩中文字幕91在线看|精品久久久无码中文字幕边打电话

當(dāng)前位置:首頁 > 芯聞號(hào) > 充電吧
[導(dǎo)讀] ?1,malloc與free是C++/C語言的標(biāo)準(zhǔn)庫函數(shù),new/delete是C++的運(yùn)算符。它們都可用于申請動(dòng)態(tài)內(nèi)存和釋放內(nèi)存。 ?2,?對(duì)于非內(nèi)部數(shù)據(jù)類型的對(duì)象而言,光用maloc/free


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

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

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

?4,C++程序經(jīng)常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動(dòng)態(tài)內(nèi)存?new?是個(gè)操作符,和什么"+","-","="...有一樣的地位?簡單的說:?malloc,free是c的函數(shù),new,delete是c++的運(yùn)算符?此外,new是強(qiáng)制類型的,malloc不是,需要類型轉(zhuǎn)換?當(dāng)然還有很多不同?new?可以調(diào)用構(gòu)造函數(shù)在聲明的時(shí)候初始化?malloc只是分配空間,需要在其他地方初始化?而delete不僅會(huì)釋放空間,在釋放前會(huì)調(diào)用析構(gòu)函數(shù)?而且malloc需要指定分配空間大小,?而new是自動(dòng)計(jì)算的

New與malloc的區(qū)別集錦

1、new 是c++中的操作符,malloc是c 中的一個(gè)函數(shù)

2、new 不止是分配內(nèi)存,而且會(huì)調(diào)用類的構(gòu)造函數(shù),同理delete會(huì)調(diào)用類的析構(gòu)函數(shù),而malloc則只分配內(nèi)存,不會(huì)進(jìn)行初始化類成員的工作,同樣free 也不會(huì)調(diào)用析構(gòu)函數(shù)

3、內(nèi)存泄漏對(duì)于malloc或者new都可以檢查出來的,區(qū)別在于new可以指明是那個(gè)文件的那一行,而malloc沒有這些信息。

4、new 和 malloc效率比較

new 有三個(gè)字母, malloc有六個(gè)字母

new可以認(rèn)為是malloc加構(gòu)造函數(shù)的執(zhí)行。

new出來的指針是直接帶類型信息的。

而malloc返回的都是void指針。

一:new delete 是運(yùn)算符,malloc,free是函數(shù)

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

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

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

我們先看一看malloc/free和new/delete如何實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)內(nèi)存管理,見示例。

?

class Obj

{

public :

??????????Obj(void){ cout < < “Initialization” << endl; }

~Obj(void){ cout < < “Destroy” << endl; }

void??????Initialize(void){ cout < < “Initialization” << endl; }

void??????Destroy(void){ cout < < “Destroy” << endl; }

};

?

void UseMallocFree(void)

{

??????Obj????*a = (obj *)malloc(sizeof(obj));?????// 申請動(dòng)態(tài)內(nèi)存

??????a->Initialize();??????????????????????????// 初始化

??????//…

??????a->Destroy();?????// 清除工作

??????free(a);??????????// 釋放內(nèi)存

}

?

void UseNewDelete(void)

{

??????Obj????*a = new Obj;????// 申請動(dòng)態(tài)內(nèi)存并且初始化

??????//…

??????delete a;?????????????// 清除并且釋放內(nèi)存

}

示例用malloc/free和new/delete如何實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)內(nèi)存管理

類Obj的函數(shù)Initialize模擬了構(gòu)造函數(shù)的功能,函數(shù)Destroy模擬了析構(gòu)函數(shù)的功 能。函數(shù)UseMallocFree中,由于malloc/free不能執(zhí)行構(gòu)造函數(shù)與析構(gòu)函數(shù),必須調(diào)用成員函數(shù)Initialize和Destroy 來完成初始化與清除工作。函數(shù)UseNewDelete則簡單得多。

所以我們不要企圖用malloc/free來完成動(dòng)態(tài)對(duì)象的內(nèi)存管理,應(yīng)該用new/delete。 由于內(nèi)部數(shù)據(jù)類型的“對(duì)象”沒有構(gòu)造與析構(gòu)的過程,對(duì)它們而言malloc/free和new/delete是等價(jià)的。

既然new/delete的功能完全覆蓋了malloc/free,為什么C++不把malloc /free淘汰出局呢?這是因?yàn)镃++程序經(jīng)常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動(dòng)態(tài)內(nèi)存。

如果用free釋放“new創(chuàng)建的動(dòng)態(tài)對(duì)象”,那么該對(duì)象因無法執(zhí)行析構(gòu)函數(shù)而可能導(dǎo)致程序出錯(cuò)。如 果用delete釋放“malloc申請的動(dòng)態(tài)內(nèi)存”,理論上講程序不會(huì)出錯(cuò),但是該程序的可讀性很差。所以new/delete 必須配對(duì)使用,malloc/free也一樣。

二:new delete在實(shí)現(xiàn)上其實(shí)調(diào)用了malloc,free函數(shù)。

三:new operator除了分配內(nèi)存,還要調(diào)用構(gòu)造函數(shù)。

malloc函數(shù)只是負(fù)責(zé)分配內(nèi)存。

?

///////////////////////////////////////

new 一維數(shù)組

XXX *arr;
int len; // 動(dòng)態(tài)確定該長度值

arr = new XXX[len]; // 動(dòng)態(tài)分配,也可以使用 malloc
...
delete[] arr; //不要忘記釋放


new 多維數(shù)組

正確的做法是先聲明一個(gè)n維數(shù)組,每個(gè)單元是指向char的指針,再分別對(duì)每個(gè)單元分配內(nèi)存.代碼如下

char **array=new char*[n];
for(int i=0;i array[i]=new char[m];

注意:上面代碼在釋放分配的內(nèi)存時(shí)要特別注意。因?yàn)檫@是“深度內(nèi)存分配”,所以釋放時(shí),要對(duì)每個(gè)單元里的指針指向的內(nèi)存予以釋放。釋放內(nèi)存代碼如下:

for(i=0;i??????delete[] array[i];
delete[] array;

?

?

malloc函數(shù)
原型:extern void *malloc(unsigned int num_bytes);

用法:#include

功能:分配長度為num_bytes字節(jié)的內(nèi)存塊

說明:如果分配成功則返回指向被分配內(nèi)存的指針,否則返回空指針NULL。
當(dāng)內(nèi)存不再使用時(shí),應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。

舉例:
// malloc.c

#include

clrscr(); // clear screen
p=(char *)malloc(100);
if(p)
printf("Memory Allocated at: %x",p);
else
printf("Not Enough Memory!n");
free(p);

getchar();
return 0;
}

函數(shù)聲明(函數(shù)原型):
void *malloc(int size);
說明:malloc 向系統(tǒng)申請分配指定size個(gè)字節(jié)的內(nèi)存空間。返回類型是 void* 類型。void* 表示未確定類型的指針。C,C++規(guī)定,void* 類型可以強(qiáng)制轉(zhuǎn)換為任何其它類型的指針。
從函數(shù)聲明上可以看出。malloc 和 new 至少有兩個(gè)不同: new 返回指定類型的指針,并且可以自動(dòng)計(jì)算所需要大小。比如:
int *p;
p = new int; //返回類型為int* 類型(整數(shù)型指針),分配大小為 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回類型為 int* 類型(整數(shù)型指針),分配大小為 sizeof(int) * 100;
而 malloc 則必須由我們計(jì)算要字節(jié)數(shù),并且在返回后強(qiáng)行轉(zhuǎn)換為實(shí)際類型的指針。
int* p;
p = (int *) malloc (sizeof(int));
第一、malloc 函數(shù)返回的是 void * 類型,如果你寫成:p = malloc (sizeof(int)); 則程序無法通過編譯,報(bào)錯(cuò):“不能將 void* 賦值給 int * 類型變量”。所以必須通過 (int *) 來將強(qiáng)制轉(zhuǎn)換。
第二、函數(shù)的實(shí)參為 sizeof(int) ,用于指明一個(gè)整型數(shù)據(jù)需要的大小。如果你寫成:
int* p = (int *) malloc (1);
代碼也能通過編譯,但事實(shí)上只分配了1個(gè)字節(jié)大小的內(nèi)存空間,當(dāng)你往里頭存入一個(gè)整數(shù),就會(huì)有3個(gè)字節(jié)無家可歸,而直接“住進(jìn)鄰居家”!造成的結(jié)果是后面 的內(nèi)存中原有數(shù)據(jù)內(nèi)容全部被清空。
malloc 也可以達(dá)到 new [] 的效果,申請出一段連續(xù)的內(nèi)存,方法無非是指定你所需要內(nèi)存大小。
比如想分配100個(gè)int類型的空間:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個(gè)整數(shù)的內(nèi)存空間。
另外有一點(diǎn)不能直接看出的區(qū)別是,malloc 只管分配內(nèi)存,并不能對(duì)所得的內(nèi)存進(jìn)行初始化,所以得到的一片新內(nèi)存中,其值將是隨機(jī)的。
除了分配及最后釋放的方法不一樣以外,通過malloc或new得到指針,在其它操作上保持一致。

對(duì)其做一個(gè)特例補(bǔ)充
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
此時(shí)得到的是Got a valid pointer。把0賦給maclloc能得到一個(gè)合法的指針。


struct hostent *hp;

//注意是sizeof( sturct hostent )而不是sizeof( sturct hostent* )
//其中N代表你需要的sturct hostent類型數(shù)據(jù)的數(shù)量
hp = ( struct hostent* ) malloc ( N * sizeof( sturct hostent ) );

if ( !hp )??????//建議要加上這個(gè)內(nèi)存分配成功與否的檢測
{
// 添加內(nèi)存分配失敗時(shí)的處理方法
}


new delete, free malloc

首先應(yīng)該知道m(xù)alloc 和free是匹配的;new和delete是匹配的,他們不可以混淆。???

malloc和new都申請空間,但是new是強(qiáng)類型的分配,會(huì)調(diào)用對(duì)象的構(gòu)造函數(shù)初始化對(duì)象,而malloc僅分配內(nèi)存空間但是不初始化。

new???自適應(yīng)類型,malloc需要強(qiáng)制轉(zhuǎn)換new按類型進(jìn)行分配,malloc需要指定內(nèi)存大小對(duì)于對(duì)象來說free的確釋放了對(duì)象的內(nèi)存,但是不調(diào)用對(duì)象的 析構(gòu)函數(shù)。delete不僅釋放對(duì)象的內(nèi)存,并且調(diào)用對(duì)象的析構(gòu)函數(shù)所以在對(duì)象中用free刪除new創(chuàng)建的對(duì)象,內(nèi)存就有可能泄露在delete內(nèi)部仍 調(diào)用了free .

補(bǔ)充一點(diǎn):new和malloc雖然都是申請內(nèi)存,但申請的位置不同,new的內(nèi)存從free store分配,而malloc的內(nèi)存從heap分配(詳情請看ISO14882的內(nèi)存管理部分),free store和heap很相似,都是動(dòng)態(tài)內(nèi)存,但是位置不同,這就是為什么new出來的內(nèi)存不能通過free來釋放的原因。不過微軟編譯器并沒有很好的執(zhí)行 標(biāo)準(zhǔn),很有可能把free store和heap混淆了,因此,free有時(shí)也可以。

再補(bǔ)充一點(diǎn):delete時(shí)候不需要檢查NULL

delete???NULL;??????是沒有任何問題的,所以?????

if(p)?????

{?????????????????

delete???p;?????????????????

p???=???NULL;?????

}?????

還不如?????

delete???p;?????

p???=???NULL;

而free(NULL)那就麻煩大了。

1.malloc與free是C++/C語言的標(biāo)準(zhǔn)庫函數(shù),new/delete是C++的 運(yùn)算符。它們都可用于申請動(dòng)態(tài)內(nèi)存和釋放內(nèi)存。
2.對(duì)于非內(nèi)部數(shù)據(jù)類型的對(duì)象而言,光用maloc/free無 法滿足動(dòng)態(tài)對(duì)象的要求。對(duì)象在創(chuàng)建的同時(shí)要自動(dòng)執(zhí)行構(gòu)造函數(shù),對(duì)象在消亡之前要自動(dòng)執(zhí)行析構(gòu)函數(shù)。由于malloc/free是 庫函數(shù)而不是運(yùn)算符,不在編譯器控制權(quán)限之內(nèi),不能夠把執(zhí)行構(gòu)造函數(shù)和析構(gòu)函數(shù)的任務(wù)強(qiáng)加于malloc/free。
3.C++語 言需要一個(gè)能完成動(dòng)態(tài)內(nèi)存分配和初始化工作的運(yùn)算符new,以及一個(gè)能完成清理與釋放內(nèi)存工作的運(yùn)算符delete。 注意new/delete不是庫函數(shù)。
我們先看一看malloc/free和new/delete如 何實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)內(nèi)存管理,見示例7-8。
class?Obj
{
public?:

Obj(void){ cout?<<?“Initialization”?<<?endl; }
~Obj(void){ cout?<<?“Destroy”?<<?endl; }
void????Initialize(void){ cout?<<?“Initialization”?<<?endl; }
void????Destroy(void){ cout?<<?“Destroy”?<<?endl; }
};
void?UseMallocFree(void)
{???Obj??*a?=?(obj?*)malloc(sizeof(obj));???//?申請動(dòng)態(tài)內(nèi)存
????a->Initialize();????????????????????????//?初始化
//...?a->Destroy();???//?清除工作
????free(a);????????//?釋放內(nèi)存
}
void?UseNewDelete(void)
{
Obj??*a?=?new?Obj;??//?申請動(dòng)態(tài)內(nèi)存并且初始化
?????//...delete a;???????????//?清除并且釋放內(nèi)存
}
示例7-8?用malloc/free和new/delete如 何實(shí)現(xiàn)對(duì)象的動(dòng)態(tài)內(nèi)存管理
類Obj的函數(shù)Initialize模 擬了構(gòu)造函數(shù)的功能,函數(shù)Destroy模擬了析構(gòu)函數(shù)的功能。函數(shù)UseMallocFree中, 由于malloc/free不能執(zhí)行構(gòu)造函數(shù)與析構(gòu)函數(shù),必須調(diào)用成員函數(shù)Initialize和Destroy來 完成初始化與清除工作。函數(shù)UseNewDelete則簡單得多。

所以我們不要企 圖用malloc/free來完成動(dòng)態(tài)對(duì)象的內(nèi)存管理,應(yīng)該用new/delete。由于內(nèi)部數(shù)據(jù) 類型的“對(duì)象”沒有構(gòu)造與析構(gòu)的過程,對(duì)它們而言malloc/free和new/delete是 等價(jià)的。
4.既然new/delete的功能完全覆蓋了malloc/free, 為什么C++不把malloc/free淘汰出局呢?這是因?yàn)镃++程 序經(jīng)常要調(diào)用C函數(shù),而C程序只能用malloc/free管理動(dòng)態(tài)內(nèi) 存。

如果用free釋放“new創(chuàng)建的動(dòng)態(tài)對(duì)象”,那 么該對(duì)象因無法執(zhí)行析構(gòu)函數(shù)而可能導(dǎo)致程序出錯(cuò)。如果用delete釋放“malloc申請的動(dòng)態(tài) 內(nèi)存”,理論上講程序不會(huì)出錯(cuò),但是該程序的可讀性很差。所以new/delete必須配對(duì)使用,malloc/free也 一樣。

5.new的幾種用法:

int?*p=new?int;?//在自由存儲(chǔ)區(qū)開辟一個(gè)int變量?
int?*p=new?int[10];//在自由存儲(chǔ)區(qū)開辟一個(gè) int數(shù)組,有10個(gè)元素
int?*p=new?int(10);//在自由存儲(chǔ)區(qū)開辟一個(gè)int變量,并初始化為10

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時(shí)聯(lián)系本站刪除( 郵箱:macysun@21ic.com )。
換一批
延伸閱讀
關(guān)閉