C 中棧和堆的區別及區分物件儲存在堆或棧中的方法

2021-07-23 20:53:10 字數 722 閱讀 7090

剛開始學習c++,記錄下點點滴滴,同時也分享下

棧:函式內區域性變數的儲存單元都可以在棧上建立,函式執行結束時這些儲存單元自動被釋放,棧內分配運算內置於處理器的指令集中,效率高,但是分配的記憶體容量有限。

堆:又稱為動態記憶體分配,程式在執行的時候用new申請任意多少的記憶體,由程式設計師自己負責在何時用delete釋放記憶體。動態記憶體的生存週期由我們決定,使用靈活,但是問題也比較多。

剛開始學習c++,感覺會有很多人和我一樣,可能明白堆和棧的區別,也能明白簡單情況下物件是儲存在堆中還是棧中,複雜的就有可能分不清了。

int main()

輸出結果是

指標i指向的物件位址要低於j指向的位址,是向高位址位擴充套件,所以指標i,j指向的物件儲存在堆中。而a,b的位址可以看出,是向低位址位擴充套件,所以a,b是儲存在棧中。

細心的朋友可以發現,我**中有用到了delete i,這裡也是有用的,因為這是第2種判斷物件儲存位置的方法。指標只能指向堆中物件,不能指向棧中物件,可以用指標指向要判斷的物件,然後用delete關鍵字刪除指標指向的物件,如果程式崩潰,說明不能刪除,物件是儲存在棧中的。反之物件是儲存在堆中。為什麼會這樣,因為棧的釋放是不能由我們控制的,是自動釋放,人為干涉就會使程式崩潰。

剛剛開始學習,不知道理解的對不對,希望大家指正

c 中堆和棧的區別

詳細的可以看下這篇部落格 乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。2 堆區 heap 一般由程式設計師分配釋放,需要程式設計師手動釋放。3 全域性區 靜態區 static 全域性變數和靜態變數的儲存是放在一...

c 中記憶體的分類及堆和棧的區別

c 中經常操作的記憶體分為以下幾個類別 1 棧區 stack 由編譯器自動分配和釋放,存放函式的引數值 區域性變數的值等等。其操作方式類似於資料結構中的棧 只要棧的剩餘空間大於申請空間,系統就為其提供記憶體,否則包異常提示棧溢位。在windows下棧是向低位址拓展的資料結構,是一塊連續的記憶體空間,...

c 棧和堆的區別

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