從函式宣告上可以看出。malloc 和 new 至少有兩個不同: new 返回指定型別的
指標,並且可以自動計算所需要大小。比如:
1
2
3
int
*p;
p =
new
int
;
//返回型別為int* 型別(整數型指標),分配大小為 sizeof(int);
或:1
2
3
int
* parr;
parr =
new
int
[100];
//返回型別為 int* 型別(整數型指標),分配大小為 sizeof(int) * 100;
而 malloc 則必須要由我們計算位元組數,並且在返回後強行轉換為實際型別的
指標。1
2
3
4
5
6
7
int
* p;
p = (
int
*)
malloc
(
sizeof
(
int
)*128);
//分配128個(可根據實際需要替換該數值)整型儲存單元,
//並將這128個連續的整型儲存單元的首位址儲存到指標變數p中
double
*pd=(
double
*)
malloc
(
sizeof
(
double
)*12);
//分配12個double型儲存單元,
//並將首位址儲存到指標變數pd中
第一、malloc 函式返回的是 void * 型別。對於c++,如果你寫成:p = malloc (sizeof(int)); 則程式無法通過編譯,報錯:「不能將 void* 賦值給 int * 型別
變數」。所以必須通過 (int *) 來將
強制轉換。而對於c,沒有這個要求,但為了使c程式更方便的移植到c++中來,建議養成
強制轉換的習慣。
第二、函式的
實參為 sizeof(int) ,用於指明乙個
整型資料需要的大小。如果你寫成:
1
int
* p = (
int
*)
malloc
(1);
**也能通過編譯,但事實上只分配了1個位元組大小的記憶體空間,當你往裡頭存入乙個整數,就會有3個位元組無家可歸,而直接「住進鄰居家」!造成的結果是後面的記憶體中原有資料內容被改寫。
在linux中可以有這樣:malloc(0),這是因為linux中malloc有乙個下限值16bytes,注意malloc(-1)是禁止的;
但是在某些系統中是不允許malloc(0)的。在規範的程式中我們有必要按照這樣的格式去使用malloc及
free:
1
2
3
4
5
6
7
8
9
10
type *p;
if
(null == (p = (type *)
malloc
(
sizeof
(type))))
/*請使用if來判斷,這是有必要的*/
...
/*其它***/
free
(p);
p = null;
/***上這句*/
malloc 也可以達到 new 的效果,申請出一段連續的記憶體,方法無非是指定你所需要記憶體大小。
比如想分配100個int型別的空間:
1
2
int
* p = (
int
*)
malloc
(
sizeof
(
int
) * 100 );
//分配可以放得下100個整數的記憶體空間。
另外有一點不能直接看出的區別是,malloc 只管分配記憶體,並不能對所得的記憶體進行初始化,所以得到的一片新記憶體中,其值將是隨機的。
除了分配及最後釋放的方法不一樣以外,通過malloc或new得到
指標,在其它操作上保持一致。
對其做乙個特例補充
1
2
3
4
5
char
*ptr;
if
((ptr = (
char
*)
malloc
(0)) == null)
puts
(
"got a null pointer"
);
else
puts
(
"got a valid pointer"
);
此時得到的是got a valid pointer。把0賦給malloc能得到乙個合法的
指標。
new和malloc的區別
1 new 是c 中的操作符,malloc是c 中的乙個函式 2 new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的析構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫析構函式 3 記憶體洩漏對於malloc或者new都可以檢查出來的,...
malloc和new的區別
1,malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2,對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動執行析構函式。由於malloc f...
new 和 malloc 的區別
new 和 malloc 的區別 1.malloc與free是c c語言的標準庫函式,new delete是c 的運算子。它們都可用於申請動態記憶體和釋放記憶體。2.對於非內部資料型別的物件而言,光用maloc free無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動...