iT邦幫忙

2022 iThome 鐵人賽

DAY 3
0
Software Development

用C++ 設計程式中的系統櫃系列 第 3

[Day 03] 用C++ 設計程式中的系統櫃:動態配置記憶體(前傳)

  • 分享至 

  • xImage
  •  

既然有動態配置記憶體,那麼有靜態配置的記憶體嗎?

當然有喔!


靜態配置的記憶體

在 C++ 中,什麼時候會用到靜態配置記憶體,我只能說是大多時候喔!

// 靜態記憶體範例
int n = 5;
int arr[] = {1, 2, 3, 6, 4};

那麼他有什麼特色呢?

  1. 靜態記憶體的配置是由編譯器處理的,因此當你編譯結束,靜態記憶體都已經配置完畢。
  2. 靜態記憶體被儲存/分配在 Stack 上。
  3. 當靜態記憶體的變數再作用域內使用完畢,系統會自動釋放這塊記憶體。

問題的出現(ㄧ)

#include <iostream>

int main() {
    int arrLength;
    std::cin >> arrLength;
    int arr[arrLength];
}

我們說編譯器會在編譯結束時,完成靜態記憶體的配置,但是上述的程式碼的行為是「執行程式碼時,我們才知道陣列長度」,那麼這個結果又會是如何呢?

執行小程式時,不會出問題,因為系統給定的記憶體超過你所需要的記憶體量。但是當你要求的記憶體過於龐大,就有機會出現錯誤!

那要怎麼處理呢?使用動態配置記憶體!


問題的出現(二)

#include <iostream>

int *add(int x, int y) {
    int result = x + y;
    return &result;
}

int main() {
    int a = 1, b = 2;
    std::cout << *add(a, b) << std::endl;
}

編譯上述的程式碼雖然可能不會給你錯誤訊息(ERROR),但是你一定會收到如下的警告訊息(WARNING)

warning: address of stack memory associated with local variable 'result' returned [-Wreturn-stack-address] return &result;

因為你使用了區域變數作為回傳值,且儲存這個變數的記憶體準備要被系統清除了!你有機會因為失去這塊記憶體的存取權而得到 Segmentation Fault。

那要怎麼改善呢?使用動態配置記憶體!


下一篇,就來正式介紹動態配置記憶體吧!並解決上述的兩個問題。


上一篇
[Day 02] 用C++ 設計程式中的系統櫃:指標概論
下一篇
[Day 04] 用C++ 設計程式中的系統櫃:動態配置記憶體
系列文
用C++ 設計程式中的系統櫃30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言