C 堆和棧的區別

2021-10-02 23:54:16 字數 956 閱讀 3994

1. 堆疊的區別?

(1)堆疊空間分配區別:

棧(作業系統):由作業系統自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧;

堆(作業系統): 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os**,分配方式倒是類似於鍊錶。

(2)堆疊的快取方式區別

棧:是記憶體中儲存值型別的,大小為2m(window,linux下預設為8m,可以更改),超出則會報錯,記憶體溢位

堆:記憶體中,儲存的是引用資料型別,引用資料型別無法確定大小,堆實際上是乙個在記憶體中使用到記憶體中零散空間的鍊錶結構的儲存空間,堆的大小由引用型別的大小直接決定,引用型別的大小的變化直接影響到堆的變化

(3)堆疊資料結構上的區別

堆(資料結構):堆可以被看成是一棵樹,如:堆排序;

棧(資料結構):一種先進後出的資料結構。

2.new 和 delete 是如何實現的,與 malloc 和 free有什麼異同?

new操作針對資料型別的處理,分為兩種情況:

(1) 簡單資料型別(包括基本資料型別和不需要建構函式的型別)

簡單型別直接呼叫 operator new 分配記憶體;

可以通過new_handler 來處理 new 失敗的情況;

new 分配失敗的時候不像 malloc 那樣返回 null,它直接丟擲異常(bad_alloc)。要判斷是否分配成功應該用異常捕獲的機制;

(2)複雜資料型別(需要由建構函式初始化物件)

new 複雜資料型別的時候先呼叫operator new,然後在分配的記憶體上呼叫建構函式。

delete也分為兩種情況:

(1) 簡單資料型別(包括基本資料型別和不需要析構函式的型別)

delete簡單資料型別預設只是呼叫free函式。

(2)複雜資料型別(需要由析構函式銷毀物件)

delete複雜資料型別先呼叫析構函式再呼叫operator delete。

C 堆和棧區別

c 中,記憶體分為5個區 堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧 是由編譯器在需要時自動分配,不需要時自動清除的變數儲存區。通常存放區域性變數 函式引數等。堆 是由new分配的記憶體塊,由程式設計師釋放 編譯器不管 一般乙個new與乙個delete對應,乙個new與乙個delete對...

c 棧和堆的區別

在c 中,記憶體分成5個區,他們分別是堆 棧 自由儲存區 全域性 靜態儲存區和常量儲存區。棧,就是那些由編譯器在需要的時候分配,在不需要的時候自動清楚的變數的儲存區。裡面的變數通常是區域性變數 函式引數等。堆,就是那些由new分配的記憶體塊,他們的釋放編譯器不去管,由我們的應用程式去控制,一般乙個n...

C 堆和棧的區別

堆和棧的區分 堆 heap 棧 stack 1 記憶體分配方面 堆 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os 注意它與資料結構中的堆是兩回事,分配方式是類似於鍊錶。可能用到的關鍵字如下 new malloc delete free等等。棧 由編譯器 compiler 自動分...