久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標(biāo)題: malloc與new函數(shù)詳解 [打印本頁(yè)]

作者: 51黑tt    時(shí)間: 2016-3-5 23:51
標(biāo)題: malloc與new函數(shù)詳解
malloc函數(shù)
原型:extern void *malloc(unsigned int num_bytes);
用法:#include <malloc.h>
功能:分配長(zhǎng)度為num_bytes字節(jié)的內(nèi)存塊
說(shuō)明:如果分配成功則返回指向被分配內(nèi)存的指針,否則返回空指針NULL。
當(dāng)內(nèi)存不再使用時(shí),應(yīng)使用free()函數(shù)將內(nèi)存塊釋放。
舉例:
// malloc.c
#include <syslib.h>
#include <malloc.h>
main()
{
char *p;
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);
說(shuō)明:malloc 向系統(tǒng)申請(qǐng)分配指定size個(gè)字節(jié)的內(nèi)存空間。返回類(lèi)型是 void* 類(lèi)型。void* 表示未確定類(lèi)型的指針。C,C++規(guī)定,void* 類(lèi)型可以強(qiáng)制轉(zhuǎn)換為任何其它類(lèi)型的指針。
從函數(shù)聲明上可以看出。malloc 和 new 至少有兩個(gè)不同: new 返回指定類(lèi)型的指針,并且可以自動(dòng)計(jì)算所需要大小。比如:
int *p;
p = new int; //返回類(lèi)型為int* 類(lèi)型(整數(shù)型指針),分配大小為 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回類(lèi)型為 int* 類(lèi)型(整數(shù)型指針),分配大小為 sizeof(int) * 100;
而 malloc 則必須由我們計(jì)算要字節(jié)數(shù),并且在返回后強(qiáng)行轉(zhuǎn)換為實(shí)際類(lèi)型的指針。
int* p;
p = (int *) malloc (sizeof(int));
第一、malloc 函數(shù)返回的是 void * 類(lèi)型,如果你寫(xiě)成:p = malloc (sizeof(int)); 則程序無(wú)法通過(guò)編譯,報(bào)錯(cuò):“不能將 void* 賦值給 int * 類(lèi)型變量”。所以必須通過(guò) (int *) 來(lái)將強(qiáng)制轉(zhuǎn)換。
第二、函數(shù)的實(shí)參為 sizeof(int) ,用于指明一個(gè)整型數(shù)據(jù)需要的大小。如果你寫(xiě)成:
int* p = (int *) malloc (1);
代碼也能通過(guò)編譯,但事實(shí)上只分配了1個(gè)字節(jié)大小的內(nèi)存空間,當(dāng)你往里頭存入一個(gè)整數(shù),就會(huì)有3個(gè)字節(jié)無(wú)家可歸,而直接“住進(jìn)鄰居家”!造成的結(jié)果是后面的內(nèi)存中原有數(shù)據(jù)內(nèi)容全部被清空。
malloc 也可以達(dá)到 new [] 的效果,申請(qǐng)出一段連續(xù)的內(nèi)存,方法無(wú)非是指定你所需要內(nèi)存大小。
比如想分配100個(gè)int類(lèi)型的空間:
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ī)的。
除了分配及最后釋放的方法不一樣以外,通過(guò)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類(lèi)型數(shù)據(jù)的數(shù)量
hp = ( struct hostent* ) malloc ( N * sizeof( sturct hostent ) );
if ( !hp )      //建議要加上這個(gè)內(nèi)存分配成功與否的檢測(cè)
{
       // 添加內(nèi)存分配失敗時(shí)的處理方法
}

new delete, free malloc
首先應(yīng)該知道m(xù)alloc 和free是匹配的;new和delete是匹配的,他們不可以混淆。   
malloc和new都申請(qǐng)空間,但是new是強(qiáng)類(lèi)型的分配,會(huì)調(diào)用對(duì)象的構(gòu)造函數(shù)初始化對(duì)象,而malloc僅分配內(nèi)存空間但是不初始化。
new   自適應(yīng)類(lèi)型,malloc需要強(qiáng)制轉(zhuǎn)換new按類(lèi)型進(jìn)行分配,malloc需要指定內(nèi)存大小對(duì)于對(duì)象來(lái)說(shuō)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雖然都是申請(qǐng)內(nèi)存,但申請(qǐng)的位置不同,new的內(nèi)存從free store分配,而malloc的內(nèi)存從heap分配(詳情請(qǐng)看ISO14882的內(nèi)存管理部分),free store和heap很相似,都是動(dòng)態(tài)內(nèi)存,但是位置不同,這就是為什么new出來(lái)的內(nèi)存不能通過(guò)free來(lái)釋放的原因。不過(guò)微軟編譯器并沒(méi)有很好的執(zhí)行標(biāo)準(zhǔn),很有可能把free store和heap混淆了,因此,free有時(shí)也可以。
再補(bǔ)充一點(diǎn):delete時(shí)候不需要檢查NULL
delete   NULL;      是沒(méi)有任何問(wèn)題的,所以     
if(p)     
{                 
delete   p;                 
p   =   NULL;     
}     
還不如     
delete   p;     
p   =   NULL;
而free(NULL)那就麻煩大了。






歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 日日日色 | 久久精品国产亚洲一区二区三区 | 久久久久久久一区二区三区 | 在线视频一区二区三区 | 久久com| 伊人狠狠干 | 91免费视频 | 日本特黄a级高清免费大片 特黄色一级毛片 | 操操日 | 超碰在线播 | 中文字幕精品一区 | 国产aa | 色橹橹欧美在线观看视频高清 | 影音先锋男 | 免费观看成人鲁鲁鲁鲁鲁视频 | 国产综合视频 | 日韩精品 电影一区 亚洲 | 久久精品一 | 日韩最新网址 | 91极品尤物在线播放国产 | 成人性生交a做片 | 亚洲国产精品久久久 | 久久男人| 欧美日韩在线看 | 一级大片免费 | 中文字幕久久精品 | 精精国产xxxx视频在线 | 国产成人午夜高潮毛片 | 国产99精品 | 国产欧美日韩综合精品一区二区 | www.玖玖玖| 亚洲一区中文字幕在线观看 | 日韩在线播放一区 | 一区二区免费看 | 国产亚洲精品美女久久久久久久久久 | 美女黄视频网站 | 亚洲一区二区三区久久久 | 国产精品一区二区久久 | 视频一区中文字幕 | 欧美精品二区三区 | 久久国产精品久久久久 |