malloc和new的區別

2021-06-20 03:16:02 字數 3394 閱讀 8373

從函式宣告上可以看出。malloc 和 new 至少有兩個不同: new 返回指定型別的

指標,並且可以自動計算所需要大小。比如:

1

2

3

int*p;

p =newint;

//返回型別為int* 型別(整數型指標),分配大小為 sizeof(int);

或:1

2

3

int* parr;

parr =newint[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無法滿足動態物件的要求。物件在建立的同時要自動執行建構函式,物件在消亡之前要自動...