malloc函數
原型:extern void *malloc(unsigned int num_bytes);
用法:#include <malloc.h>
功能:分配長度為num_bytes字節的內存塊
說明:如果分配成功則返回指向被分配內存的指針,否則返回空指針NULL。
當內存不再使用時,應使用free()函數將內存塊釋放。
舉例:
// 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;
}
函數聲明(函數原型):
void *malloc(int size);
說明:malloc 向系統申請分配指定size個字節的內存空間。返回類型是 void* 類型。void* 表示未確定類型的指針。C,C++規定,void* 類型可以強制轉換為任何其它類型的指針。
從函數聲明上可以看出。malloc 和 new 至少有兩個不同: new 返回指定類型的指針,并且可以自動計算所需要大小。比如:
int *p;
p = new int; //返回類型為int* 類型(整數型指針),分配大小為 sizeof(int);
或:
int* parr;
parr = new int [100]; //返回類型為 int* 類型(整數型指針),分配大小為 sizeof(int) * 100;
而 malloc 則必須由我們計算要字節數,并且在返回后強行轉換為實際類型的指針。
int* p;
p = (int *) malloc (sizeof(int));
第一、malloc 函數返回的是 void * 類型,如果你寫成:p = malloc (sizeof(int)); 則程序無法通過編譯,報錯:“不能將 void* 賦值給 int * 類型變量”。所以必須通過 (int *) 來將強制轉換。
第二、函數的實參為 sizeof(int) ,用于指明一個整型數據需要的大小。如果你寫成:
int* p = (int *) malloc (1);
代碼也能通過編譯,但事實上只分配了1個字節大小的內存空間,當你往里頭存入一個整數,就會有3個字節無家可歸,而直接“住進鄰居家”!造成的結果是后面的內存中原有數據內容全部被清空。
malloc 也可以達到 new [] 的效果,申請出一段連續的內存,方法無非是指定你所需要內存大小。
比如想分配100個int類型的空間:
int* p = (int *) malloc ( sizeof(int) * 100 ); //分配可以放得下100個整數的內存空間。
另外有一點不能直接看出的區別是,malloc 只管分配內存,并不能對所得的內存進行初始化,所以得到的一片新內存中,其值將是隨機的。
除了分配及最后釋放的方法不一樣以外,通過malloc或new得到指針,在其它操作上保持一致。
對其做一個特例補充
char *ptr;
if ((ptr = (char *)malloc(0)) == NULL)
puts("Got a null pointer");
else
puts("Got a valid pointer");
此時得到的是Got a valid pointer。把0賦給maclloc能得到一個合法的指針。
struct hostent *hp;
//注意是sizeof( sturct hostent )而不是sizeof( sturct hostent* )
//其中N代表你需要的sturct hostent類型數據的數量
hp = ( struct hostent* ) malloc ( N * sizeof( sturct hostent ) );
if ( !hp ) //建議要加上這個內存分配成功與否的檢測
{
// 添加內存分配失敗時的處理方法
}
new delete, free malloc
首先應該知道malloc 和free是匹配的;new和delete是匹配的,他們不可以混淆。
malloc和new都申請空間,但是new是強類型的分配,會調用對象的構造函數初始化對象,而malloc僅分配內存空間但是不初始化。
new 自適應類型,malloc需要強制轉換new按類型進行分配,malloc需要指定內存大小對于對象來說free的確釋放了對象的內存,但是不調用對象的析構函數。delete不僅釋放對象的內存,并且調用對象的析構函數所以在對象中用free刪除new創建的對象,內存就有可能泄露在delete內部仍調用了free .
補充一點:new和malloc雖然都是申請內存,但申請的位置不同,new的內存從free store分配,而malloc的內存從heap分配(詳情請看ISO14882的內存管理部分),free store和heap很相似,都是動態內存,但是位置不同,這就是為什么new出來的內存不能通過free來釋放的原因。不過微軟編譯器并沒有很好的執行標準,很有可能把free store和heap混淆了,因此,free有時也可以。
再補充一點:delete時候不需要檢查NULL
delete NULL; 是沒有任何問題的,所以
if(p)
{
delete p;
p = NULL;
}
還不如
delete p;
p = NULL;
而free(NULL)那就麻煩大了。
|