C++的內存分配要檢查失敗嗎?

轉載:C++的內存分配要檢查失敗嗎?  


看到這篇文章想到的:C++內存管理詳解


原文中有這麼一段:
* 內存分配未成功,卻使用了它。

編程新手經常犯這種錯誤,因爲他們沒有意識到內存分配會不成功。常用解決辦法是,在使用內存之前檢查指針是否爲NULL。如果指針p是函數的參數,那麼在函數的入口處用assert(p!=NULL)進行

檢查。如果是用malloc或new來申請內存,應該用if(p==NULL) 或if(p!=NULL)進行防錯處理。

對於這個,我倒是有不同的看法。
一般來說,除非做作業,否則進行任何調用都應該檢查是否成功,對調用失敗進行適當的處理。但是(請原諒我總是說“但是”),內存分配與其它的調用不一樣,很不一樣。考慮代碼:
char* p = new char[10000]; // 行 1
if(!p) // 行 2
abort(0); // 行 3

第一個疑問:行 1 的調用有可能返回 null 嗎?
首先是 C++ 的標準符合問題,在這裏,標準 C++ 是不會返回 null 的,只會拋出異常。當然,幾乎所有的編譯器都會有個編譯器參數,允許這裏不拋出異常。
其次是操作系統的問題,在這種情況下,絕大多數主流的操作系統如 Windows、Linux 是肯定不會返回 NULL 的。因爲這個內存空間要求並不大,在“虛擬內存”技術大行其道的今天,操作系統絕對會說“我頂”,確實很緊張的話操作系統會說“我暈”然後發生“震盪”(即在內存與交換內存之間搖擺,性能極度下降,近乎死機),哪怕確實搞不定了操作系統只會說“我倒”然後死機,反正絕對不會返回一個NULL給善良的程序員……這是“虛擬內存”技術對內存分配的影響;還有一種技術,這個在Linux下用得多,就是“懶算法”,也就是說,不管你要多少內存,操作系統反正先答應你再說,這麼一來,new 操作總是會被滿足。我甚至試過在物理內存只有256M的 linux 下要求分配2G內存,操作系統毫不遲疑的返回了一個指針值給我!直到你要操作這塊內存的時候,操作系統才明白過來,原來它搞不定,然後就會搞一個 core dump,但是,那與我們分配內存已經不在一個地方了……
第二個疑問:行3這個地方我們還有別的處理方法嗎?
進行錯誤處理的前提是:我們有適當的處理方法。實際上,除了嵌入式設備實時應用等少數場合(應該注意的是,這種場合本來就不應該用堆),對於內存不足,我們只有一個處理方法,就是:abort。可是這本來就是系統默認的處理方式,我爲什麼要自己寫一個呢?難道您還有更好的處理方式嗎?

所以,對於 new ,我從來不看它的返回值,也不捕捉它的異常,因爲那既無必要,也得不到你想的結果。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章