檢查new的返回值及new的用法

2021-06-04 14:59:33 字數 1659 閱讀 2571

我們知道,使用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是否成功,應該捕捉異常

trycatch( const bad_alloc& e )

據說一些老的編譯器裡,new如果分配記憶體失敗,是不丟擲異常的(大概因為那時c++還沒加入異常機制),而是和malloc一樣,返回空指標。不過,我從來都沒有遇到過new返回空指標的情況。

當然,標準的c++亦提供了乙個方法來抑制new丟擲異常,而返回空指標:

int* p = new (std::nothrow) int; //這樣,如果new失敗了,就不會丟擲異常,而是返回空指標

if( p==0 )//如此這般,這個判斷就有意義了

return -1;

//其他**

文章出處:

p.s.

c++中new的用法(

c++中,new的用法很靈活,這裡進行了簡單的總結:

1.new()分配這種型別的乙個大小的記憶體空間,並以括號中的值來初始化這個變數;

2.new分配這種型別的n個大小的記憶體空間,並用預設建構函式來初始化這些變數;

#include

#include

using namespace std;

int main()

輸出結果:

hhello

3. 當使用new運算子定義乙個多維陣列變數或陣列物件時,它產生乙個指向陣列第乙個元素的指標,返回的型別保持了除最最左邊維數外的所有維數。例如:

int *p1 = new int[10];

返回的是乙個指向int的指標int*

int (*p2)[10] = new int[2][10];

new了乙個二維陣列,去掉最左邊那一維[2],剩下int[10],所以返回的是乙個指向int[10]這種一維陣列的指標int(*)[10].

int (*p3)[2][10] = new int[5][2][10]; new了乙個三維陣列,去掉最左邊那一維[5],還有int[2][10],所以返回的是乙個指向二維陣列int[2][10]這種型別的指標int (*)[2][10].

#include

#include

using namespace std;

int main()

輸出結果:

int*

int*

int (*)[2]

int (*)[2]

int (*)[2][3]

int (*)[2][3]

檢查new的返回值

我們知道,使用malloc calloc等分配記憶體的函式時,一定要檢查其返回值是否為 空指標 亦即是檢查分配記憶體的操作是否成功 這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單的把這一招應用到new上,那就不一定正確了。我經常看到類似這樣的 int p new int size...

檢查 new 的返回值

我們都知道,使用 malloc calloc 等分配記憶體的函式時,一定要檢查其返回值是否為 空指標 亦即檢查分配記憶體的操作是否成功 這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單地把這一招應用到 new 上,那可就不一定正確了。我經常看到類似這樣的 int p new int...

C C 誤區五 檢查 new 的返回值

首先澄清一下,這個誤區僅對 c 成立,這裡不過是沿用 c c 誤區 這個銜頭罷了。我們都知道,使用 malloc calloc 等分配記憶體的函式時,一定要檢查其返回值是否為 空指標 亦即檢查分配記憶體的操作是否成功 這是良好的程式設計習慣,也是編寫可靠程式所必需的。但是,如果你簡單地把這一招應用到...