首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> VC 教學

C/C++ 記憶體管理實戰(五):記憶體耗盡處理策略與 32 位元系統虛擬記憶體迷思

     編輯:VC 教學

7.9 記憶體耗盡怎麼辦?

動態配置失敗時,malloc 與 new 回傳 NULL。三種常見處理方式:

方式一:檢查 NULL 並 return 結束函式


void Func() {
    A* a = new A;
    if (a == NULL) return;
    // ...
}

方式二:檢查 NULL 並 exit(1) 終止整個程式


void Func() {
    A* a = new A;
    if (a == NULL) {
        cout << "Memory Exhausted" << endl;
        exit(1);
    }
    // ...
}

方式三:設定 new/malloc 例外處理函式

如 Visual C++ _set_new_handler 設定自訂例外處理函式,讓 malloc 共用同一機制。詳見編譯器文件。

方式一、二最普遍。函式內多處配置記憶體時,方式一釋放記憶體麻煩,宜用方式二。

關於「不寫錯誤處理讓 OS 解決」的反駁

不行。記憶體耗盡意味著應用程式已無藥可救。若不 exit(1) 殺死壞程式,它可能拖垮作業系統。如同不擊斃歹徒,歹徒老死前會犯更多罪。

32 位元以上系統:記憶體耗盡幾乎不可能?

對 32 位元以上應用程式,無論如何用 malloc/new,**幾乎不可能導致記憶體耗盡**。

實測:Windows 98 + VC++,無限配置 float[1000000],程式不會終止,硬碟狂響(虛擬記憶體換頁),系統對鍵盤滑鼠無回應。


void main() {
    float* p = NULL;
    while (TRUE) {
        p = new float[1000000];
        cout << "eat memory" << endl;
        if (p == NULL) exit(1); // 永遠不會執行
    }
}

結論:32 位元 OS 支援虛擬記憶體,實體記憶體用盡自動用硬碟頂替。記憶體耗盡錯誤處理碼在 32 位元系統「毫無用處」。

⚠ 重要警示

不加錯誤處理將導致程式品質極差,**千萬不可因小失大**。

雖 32 位元系統幾乎不會真正耗盡記憶體,但嵌入式系統、64 位元系統大量配置、資源受限環境仍可能發生。優良程式**必須**保留錯誤處理邏輯,體現工程專業素養。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved