關於malloc函數的用法

一,函數聲明

malloc 向系統申請分配指定size個字節的內存空間。

返回類型是 void* 類型。void* 表示未確定類型的指針。

C,C++規定,void* 類型可以通過類型轉換強制轉換爲任何其它類型的指針

如果分配成功則返回指向被分配內存的指針,否則返回空指針NULL。

當內存不再使用時,應使用free()函數將內存塊釋放。

1.內存分配

例如
char *p = (char *)malloc(100);

在堆上分配了100個字節內存,返回這塊內存的首地址,把地址強制轉換成char *類型後賦給char *類型的指針變量p。同時告訴我們這塊內存將用來存儲char類型的數據。也就是說你只能通過指針變量p來操作這塊內存。這塊內存本身並沒有名字,對它的訪問是匿名訪問

但是不一定每次都能分配成功 

函數同樣要注意這點:如果所申請的內存塊大於目前堆上剩餘內存塊(整塊),則內存分配會失敗,函數返回NULL。注意這裏說的“堆上剩餘內存塊”不是所有剩餘內存塊之和,因爲malloc函數申請的是連續的一塊內存。既然malloc函數申請內存有不成功的可能,那我們在使用指向這塊內存的指針時,必須用if(NULL!=p)語句來驗證內存確實分配成功了。


2.內存釋放

既然有分配,那就必須有釋放。不然的話,有限的內存總會用光,而沒有釋放的內存卻在空閒。與malloc對應的就是free函數了。free函數只有一個參數,就是所要釋放的內存塊的首地址。

free(p); 



而free函數的作用是斬斷指針變量與這塊內存的關係。

malloc兩次只free一次會內存泄漏;malloc一次free兩次肯定會出錯。也就是說,在程序中malloc的使用次數一定要和free相等,否則必有錯誤。這種錯誤主要發生在循環使用malloc函數時,往往把malloc和free次數弄錯了。


二,malloc和new的區別

1.new返回指定類型的指針並且可以自動計算所需大小
比如:   
1)


int *p; 
p = new int;   //返回類型爲int *類型,分配的大小爲sizeof(int)
 p = new int[100];    //返回類型爲int *類型,分配的大小爲sizeof(int) * 100




 

2) 而 malloc 則必須要由我們計算字節數,並且在返回後強行轉換爲實際類型的指針。   

int* p;   
p = (int *) malloc (sizeof(int)*128);//分配128個(可根據實際需要替換該數值)整型存儲單元,並將這128個連續的整型存儲單元的首地址存儲到指針變量p中  
double *pd=(double *) malloc (sizeof(double)*12);//分配12個double型存儲單元,並將首地址存儲到指針變量pd中

2.malloc只管分配內存,並不能對所得內存初始化,所以得到新的內存其值是隨機的 

除了分配及最後釋放的方法不一樣以外,通過malloc或new得到指針,在其它操作上保持一致。



總結:

malloc和free是C/C++中的標準庫函數,new和delete是C++的運算符。對於非內置數據類型的對象而言,光用maloc/free 無法滿足動態對象的要求。對象在創建的同時要自動執行構造函數, 對象消亡之前要自動執行析構函數。由於malloc/free 是庫函數而不是運算符,不在編譯器控制權限之內,不能夠把執行構造函數和析構函數的任務強加malloc/free

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章