首先澄清一下,這個誤區僅對 c++ 成立,這裡不過是沿用「c/c++ 誤區」這個銜頭罷了。
我們都知道,使用 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;
// 其它**
檢查new的返回值
我們知道,使用malloc calloc等分配記憶體的函式時,一定要檢查其返回值是否為 空指標 亦即是檢查分配記憶體的操作是否成功 這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單的把這一招應用到new上,那就不一定正確了。我經常看到類似這樣的 int p new int size...
檢查 new 的返回值
我們都知道,使用 malloc calloc 等分配記憶體的函式時,一定要檢查其返回值是否為 空指標 亦即檢查分配記憶體的操作是否成功 這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單地把這一招應用到 new 上,那可就不一定正確了。我經常看到類似這樣的 int p new int...
檢查new的返回值及new的用法
我們知道,使用malloc calloc等分配記憶體的函式時,一定要檢查其返回值是否為 空指標 亦即是檢查分配記憶體的操作是否成功 這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單的把這一招應用到new上,那就不一定正確了。我經常看到類似這樣的 int p new int size...