C 堆與棧 空指標的釋放等

2021-10-23 09:30:55 字數 989 閱讀 6799

「不在任何東西面前失去自我,哪怕是教條,哪怕是別人的目光,哪怕是愛情。」 ——《成為簡·奧斯汀》

今天在公司聽了一堂c++課程,收穫頗豐。學到新東西的快樂真的可以蓋過其他所有。

本來今天可以寫一篇長長的日更,但是由於回家後大部分的時間花在了用ps做組內的一幅圖,導致沒有足夠的時間在12點到來之前寫很多。

只能寫一點比較明確、印象也比較深刻的內容了。

老師今天提到 stl 容器中,不同的容器執行時資料儲存的位置是不一樣的。諸如array等是執行在棧中的,而vector、string是執行在堆中的。因此,初始化array時如果指定很大的size是有可能導致棧溢位的,而vector、string則不會。

這裡就引出了乙個概念,當我們在談論程式執行時的堆和棧時是在談論什麼?

詳細內容在一篇知乎回答中寫的很詳細了,我只摘取其中基礎的部分:

堆,英文是 heap,在記憶體管理的語境下,指的是動態分配記憶體的區域。這個堆跟資料結構裡的堆不是一回事。這裡的記憶體,被分配之後需要手工釋放,否則,就會造成記憶體洩漏。

棧,英文是 stack,在記憶體管理的語境下,指的是函式呼叫過程中產生的本地變數和呼叫資料的區域。這個棧和資料結構裡的棧高度相似,都滿足「後進先出」(last-in-first-out 或 lifo)。

另外摘取另一位博主的總結:

1、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方式類似於資料結構中的棧。

2、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由os** 。注意它與資料結構中的堆是兩回事,分配方式類似於鍊錶。

今天老師特別強調了新開闢記憶體及其釋放的問題。

談到釋放時提到,c++標準中規定了,釋放空指標是不會進行任何操作的,因此是沒有安全問題的。而這一點甚至有專家都犯過錯誤。

學習使我快樂,日更亦然;

over~

C 中的堆與棧

也不知道是什麼原因,很多人總是把堆和棧混合一起,在寫程式時,總是經常脫口而出地說堆疊。網上的一些資料說堆疊的叫法是有歷史原因的,至於具體是什麼歷史原因,這不是本文所要討論的問題。堆 在資料結構中,堆是一種滿足 堆性質 至於什麼是堆性質可以查閱任何一本資料結構的書 的資料結構。然而,通常我們所指的堆都...

C語言的「空指標」與「野指標」

空指標 在c語言裡,泛型程式設計靠void型別來實現。即 一切皆空 那麼void型別的指標,是不是大大的提供了某些方便!在使用void 型別的指標時應該注意一下問題 型別轉換!1 include 2 3 int main 4 以上顯然是錯誤的!因為在強轉時,轉換的是指標型別而不是普通型別。應先解引用...

C 空指標與無型別指標

c 用0表示空指標,c用 void 0表示空指標,c 對null的定義 undef null in case has defined it.ifdef gnug define null null else g ifndef cplusplus define null void 0 else c de...