malloc和new對比,Linux程序的五個段

2021-10-23 13:35:33 字數 2241 閱讀 8121

1、如何在不知道陣列個數的情況下動態輸入陣列?

答:c語言裡這樣是不行的,只能使用動態分配記憶體。

//c語言

int*a;a=(

int*

)malloc

(sizeof

(int

)*n)

;

//c++

int*a=

newint

[n];

2、c語言的malloc和c++的new有什麼區別?

答:(1)申請記憶體所在位置

new操作符從自由儲存區(free store:凡是通過new操作符進行記憶體申請,該記憶體即為自由儲存區,可以是堆也可以是靜態儲存區,這取決於operator new的實現細節)上為物件動態分配記憶體空間;malloc從堆上動態分配記憶體。

(2)返回型別安全性

new分配記憶體成功是返回物件型別的指標,型別嚴格與物件匹配,無需進行型別轉換,故new是符合型別安全性的操作符;而malloc記憶體分配成功返回void*,需要通過強制型別轉換將void *指標轉換成我們需要的型別。

(3)記憶體分配失敗的返回值

new會丟擲bad_alloc異常,而malloc返回null。

int n=10;

int a*=(

int*

)malloc

(sizeof

(int

)*n);if

(a==

null

)else

try

catch

(bad_alloc)

(4)是否需要指定記憶體大小

new無需指定,編譯器會根據型別自行計算;malloc需要顯式指定

(5)是否呼叫建構函式/析構函式

new/delete會呼叫物件的建構函式/析構函式以完成物件的構造/析構,而malloc不會。

new:①呼叫operator new函式分配一塊足夠大、原始、未命名的記憶體空間;②編譯器執行相應的建構函式以構造物件,為其傳入初值;③兌現構造完成購,返回乙個指向該物件的指標

delete:①呼叫物件的析構函式;②編譯器呼叫operator ndelete函式釋放記憶體空間

(6)陣列

c++提供了new[ ]和delete[ ]專門處理陣列;mallo分配時c需要手動定義陣列的大小

a * ptr =

new a [10]

;delete

ptr;

int

* ptr=

(int*)

malloc

(sizeof

(int)*

10);

3、linux程序的五個段:資料段、**段、bss段、堆疊段

答:段(segmentation)是指二進位制檔案內的區域。程序對應的記憶體空間包含5個不同的資料區。

在可執行檔案中,正文段/**段(text segment / code segment)用於儲存指令;資料段(data segment)儲存已初始化的全域性變數,bss段(bss segment)儲存未賦值的的全域性變數所需的空間。

呼叫棧躲在的段稱為堆疊段(stack segment)。它不儲存咋愛可執行檔案中,而是在執行時建立。

所有段均有自己的大小,均不可越界訪問,都則出現段錯誤(segmentation fault),越界會產生棧溢位(stack overflow)。

段名稱作用

bss存放程式中未初始化的全域性變數;屬於靜態記憶體分配

資料段存放程式中已初始化的全域性變數,如static宣告的變數;屬於靜態記憶體分配

**段存放程式執行**的一塊記憶體區域;這部分區域的大小在程式執行前就已經確定,且記憶體區域通常唯讀;**段也可能包含一些唯讀常數變數,如字串常量等

堆(heap)

存放程序執行中被動態分配的記憶體段,大小不固定,可動態擴張。需釋放,否則可能記憶體洩漏導致系統不穩定【tips:windows系統在該程序退出時由os釋放,linux則旨在整個系統關閉時os才會釋放】

棧(stack)

存放程式臨時建立的區域性變數(函式弧{}中定義的變數除static),函式被呼叫時其引數也會壓入發起呼叫的進城棧,呼叫結束後函式返回值也會被存放會棧中

new與malloc的對比總結

c 中的new和c中的malloc都是用來申請記憶體空間的,那麼區別是 new在動態儲存區分配記憶體,malloc在堆上分配記憶體new返回物件型別的指標,型別與物件嚴格匹配 malloc返回 void 通過強制型別轉換成我們需要的物件型別new分配失敗時,丟擲異常,不返回null malloc分配...

malloc函式 new和malloc的區別

1 申請的記憶體所在位置 new操作符從自由儲存區上為物件動態分配記憶體空間,而malloc函式從堆上動態分配記憶體。自由儲存區是c 基於new操作符的乙個抽象概念,凡是通過new操作符進行記憶體申請,該記憶體即為自由儲存區。而堆是作業系統中的術語,是作業系統所維護的一塊特殊記憶體,用於程式的記憶體...

new和malloc的區別

1 new 是c 中的操作符,malloc是c 中的乙個函式 2 new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的析構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫析構函式 3 記憶體洩漏對於malloc或者new都可以檢查出來的,...