我們都知道,使用 malloc/calloc 等分配記憶體的函式時,一定要檢查其返回值是否為「空指標」(亦即檢查分配記憶體的操作是否成功),這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單地把這一招應用到 new 上,那可就不一定正確了。我經常看到類似這樣的**:
int* p = new int[size];
if ( p == 0 ) // 檢查 p 是否空指標
return -1;
// 其它**
其實,這裡的 if ( p == 0 ) 完全是沒啥意義的。c++ 裡,如果 new 分配記憶體失敗,預設是丟擲異常的。所以,如果分配成功,p == 0 就絕對不會成立;而如果分配失敗了,也不會執行 if ( p == 0 ),因為分配失敗時,new 就會丟擲異常跳過後面的**。如果你想檢查 new 是否成功,應該捕捉異常:
try catch ( const bad_alloc& e )
據說一些老的編譯器裡,new 如果分配記憶體失敗,是不丟擲異常的(大概是因為那時 c++ 還沒加入異常機制),而是和 malloc 一樣,返回空指標。不過我從來都沒遇到過 new 返回空指標的情況。
當然,標準 c++ 亦提供了乙個方法來抑制 new 丟擲異常,而返回空指標:
int* p = new (std::nothrow) int; // 這樣如果 new 失敗了,就不會丟擲異常,而是返回空指標
if ( p == 0 ) // 如此這般,這個判斷就有意義了
return -1;
注:文章摘抄自bellgrade的空間
c new失敗處理
在c語言中如果malloc calloc分配記憶體失敗的時候,會返回乙個空指標,但是在 中使用 new 分配記憶體的時候,標準規定new分配失敗時會丟擲異常,因此不能使用如下的方式判斷new是否成功,int p new int size if null p return 如果分配失敗,則以上 將是沒...
C new 失敗的處理
我們都知道,使用 malloc calloc 等分配記憶體的函式時,一定要檢查其返回值是否為 空指標 亦即檢查分配記憶體的操作是否成功 這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單地把這一招應用到 new 上,那可就不一定正確了。我經常看到類似這樣的 int p new int...
C new失敗的處理
我們都知道,使用 malloc calloc 等分配記憶體的函式時,一定要檢查其返回值是否為 空指標 亦即檢查分配記憶體的操作是否成功 這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如 果你簡單地把這一招應用到 new 上,那可就不一定正確了。我經常看到類似這樣的 int p new in...