堆和棧(番外)

2021-08-20 23:22:43 字數 582 閱讀 8266

什麼是堆:堆是大家共有的空間,分全域性堆和區域性堆。全域性堆就是所有沒有分配的空間,區域性堆就是使用者分配的空間。堆在作業系統對程序 初始化的時候分配,執行過程中也可以向系統要額外的堆,但是記得用完了要還給作業系統,要不然就是記憶體洩漏。

通過上面對概念的描述,可以知道:

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

堆一般由程式設計師分配釋放,若不釋放,程式結束時可能由os**。注意這裡說是可能,並非一定。所以我想再強調一次,記得要釋放!

注意它與資料結構中的堆是兩回事,分配方式倒是類似於鍊錶。

所以,舉個例子,如果你在函式上面定義了乙個指標變數,然後在這個函式裡申請了一塊記憶體讓指標指向它。實際上,這個指標的位址是在棧上,但是它所指向的內容卻是在堆上面的!這一點要注意!所以,再想想,在乙個函式裡申請了空間後,比如說下面這個函式:

// code...

void function(void)

就這個例子,千萬不要認為函式返回,函式所在的棧被銷毀指標也跟著銷毀,申請的記憶體也就一樣跟著銷毀了!這絕對是錯誤的!因為申請的內存在堆上,而函式所在的棧被銷毀跟堆完全沒有啥關係。所以,還是那句話:記得釋放!

番外 函式隨記

void swap int a,int b a 和 b 列舉四種情況 a 110 0 b 010 1 a 100 1 b 110 0 和最初的 a 一樣 a 010 1 和最初的 b 一樣 data 1 bit num bit num 為0 資料最大位1.function void getsyste...

番外 socketserver用法

是不是被一般寫法,多程序寫法,多執行緒寫法甚至是協程寫法搞的不可開交 雲裡霧裡,彷彿將要放棄 再配上伺服器要服務多個客戶端 完蛋了,全都亂了 那今天就給你推薦乙個好的模組!sockerserver 具體操作 import socketserver 1 引入模組 class myserver sock...

番外 socketserver用法

是不是被一般寫法,多程序寫法,多執行緒寫法甚至是協程寫法搞的不可開交 雲裡霧裡,彷彿將要放棄 再配上伺服器要服務多個客戶端 完蛋了,全都亂了 那今天就給你推薦乙個好的模組!sockerserver 具體操作 import socketserver 1 引入模組 class myserver sock...