C++的記憶體配置-heap and stack

執行以下的程式會出現segementation fault的原因在於記憶體配置:宣告在main()中的矩陣是被存放在stack的區域中,但stack被分配的記憶體空間並不足以存放這些矩陣。

1
2
3
4
5
6
7
int main (){
double u[162][161],unew[162][161],uans[161][161];
double v[161][162],vnew[161][162],vans[161][161];
double p[162][162],pnew[162][162],pans[161][161];
double mdot[162][162],uv[161][161];
return 0;
}

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
2
3
4
5
int main(){
int *p=new int;
delete p;
return 0;
}

一開始所出現的問題則可以透過兩個方是解決:

  1. 改使用data的記憶體區段,以全域變數宣告。
  2. 改使用heap的記憶體區段,以動態變數宣告。