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

高品質 C++/C 程式設計指南 第 7 章 (五):記憶體耗盡處理三策略與虛擬記憶體迷思

     編輯:關於C++

7.9 記憶體分配失敗:malloc/new 返回 nullptr

三大處理策略:

策略 1:函數級返回

void Func() {
    A* a = new A;
    if (a == nullptr) return; // 釋放責任在呼叫端,適合單一分配點
    ...
}

策略 2:進程級終止 (最常用)

void Func() {
    A* a = new A;
    if (a == nullptr) {
        cout << "Memory Exhausted" << endl;
        exit(1); // 徹底結束,避免殘留破壞系統
    }
    ...
}

多分配點時策略 1 麻煩 (需層層傳回釋放),**策略 2 乾淨利落**。

策略 3:自定義異常處理器

VC++ _set_new_handler 設定 new 失敗回呼,亦可讓 malloc 共用。詳見編譯器文檔。

為何不可「讓作業系統自己解決」?

記憶體耗盡 = 惡徒持刀。不 exit(1) 擊斃壞進程,它會拖垮整個 OS (如病毒擴散)。**及時止損是責任**。

32 位元+ 系統的虛擬記憶體迷思

void main() {
    float* p = nullptr;
    while (true) {
        p = new float[1000000]; // 不斷申請 4MB
        cout << "eat memory" << endl;
        if (p == nullptr) exit(1); // 永遠不會觸發!
    }
}

**現象**:硬碟狂響、系統卡死、滑鼠鍵盤無回應,**但程式不會因 nullptr 退出**。

**原因**:虛擬記憶體將硬碟空間當記憶體用,物理 RAM 用盡自動換頁,**理論上永遠分配成功**,直到硬碟也滿 (極難)。

結論與警示

  • 32/64 位元系統,**記憶體耗盡錯誤處理幾乎永不觸發**。
  • **但不可因此省略檢查**!嵌入式、實時、受限環境仍會真耗盡;且「有檢查」是專業素養、**代碼品質底線**。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved