1. 程式人生 > 實用技巧 >C++記憶體管理基礎

C++記憶體管理基礎

C++中可以訪問的記憶體,通常可以分為三類:靜態常量區、呼叫棧和堆。

靜態常量區

靜態常量區是編譯器在編譯期間就已經確定好的資料。例如在全域性範圍內宣告const char text[] = "Hello World!",text就會被存放在靜態常量區。

特點

  1. 只讀;
  2. 大小固定;
  3. 無法管理;
  4. 可以利用其特性在邏輯上做一些特定的優化。

呼叫棧

特點

  1. 被動分配,被動回收;
  2. 大小在執行時有一個動態調整的過程;
  3. 大小有系統限制;
  4. 底大頂小

問題

  1. 為什麼變數有作用域?

防止不同的變數使用相同的棧記憶體,導致後面的變數覆蓋前面的資料,從而在使用前面的變數時輸出後面的變數。所以設定作用域,使變量出了作用域不再有效。

  1. 為什麼不建議使用遞迴?

因為棧記憶體是一個非常珍貴的資源,而使用遞迴有時會產生死迴圈,將消耗棧記憶體,直至消耗完,從而產生StackOverflow的錯誤。

注意

  1. 棧記憶體先進後出,輪流使用。

同一塊記憶體要在佔用它的函式執行完畢,記憶體被回收之後,其它函式才能使用這一塊記憶體。棧中的記憶體可以被輪流使用,這也是為什麼正常的程式可以一直執行,而不會出現棧溢位的問題。

  1. 不要在函式體中宣告大塊記憶體(大型陣列,大型結構體)。

例如宣告int arr[10240000],十分佔用棧記憶體。棧記憶體十分珍貴,應避免這種情況。

視訊連結

(含字幕)C++ 讓你不再害怕記憶體和指標 其一_嗶哩嗶哩 (゜-゜)つロ 乾杯~-bilibili