C++的記憶體配置-heap and stack
執行以下的程式會出現segementation fault的原因在於記憶體配置:宣告在main()
中的矩陣是被存放在stack的區域中,但stack被分配的記憶體空間並不足以存放這些矩陣。
1 | int main (){ |
TY: Stack預設的上限好像是10mb,heap預設我記得是可以容納300萬個int吧,heap 的上限通常都比stack 大很多。兩者上限都可以另外設定,假設把Stack Memory 的大小設定成 1 GB 的話,你的程式一打開就會直接吃掉 1 GB 的 ram。
記憶體配置
記憶體配置分成幾個區段,分別是:
- stack: 區域變數存放的區域。
- heap: 動態記憶體存放的區域。
- data: 全域變數存放的區域。
- text: 程式被存放的區域。
Stack
在function被呼叫後機器才會分配記憶體空間給function的區域變數,return
過後空間就會被釋放;在下一次呼叫機器會重新分配記憶體空間給function的區域變數,亦即區域變數的記憶體位址在程式運行的過程中是有可能改變的。
Heap
C++ 中使用heap memory是透過new
這個keyword,釋放heap memory則是透過delete
這個keyword。與stack不同之處在於,它並不會在return
被執行時自動釋放記憶體空間,若是在程式結束前沒有將被分配的空間透過delete
來釋放,就會造成”memory leak”。
Memory leaks in small programs might not look like a big deal, but for long-running servers, memory leaks can slow down the whole machine and eventually cause the program to crash.
1 | int main(){ |
一開始所出現的問題則可以透過兩個方是解決:
- 改使用data的記憶體區段,以全域變數宣告。
- 改使用heap的記憶體區段,以動態變數宣告。
- Reference: Stack and Heap Memory