1. 程式人生 > >檢查new的返回值及new的用法

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

 我們知道,使用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{

        int* p = new int[SIZE];

        //其他程式碼

    }catch( const bad_alloc& e ){

        return -1;

    }

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

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

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

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

            return -1;

            //其他程式碼

文章出處:http://tech.ddvip.com/2009-05/1242375623119337.html

 

P.S.

C++中new的用法(http://blog.csdn.net/pengzhixi/archive/2009/06/17/4274984.aspx)

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

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

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

#include <iostream>

#include <cstring>

using namespace std;

int main()

{

    //char* p = new char("Hello");

    //error分配一個char(1位元組)的空間

    //用"Hello"來初始化,這明顯不對

    char* p = new char[6];

    //p = "Hello";

    //不能將字串直接賦值給該字元指標p,原因是:

    //指標p指向的是字串的第一個字元,只能用下面的

    //strcpy

    strcpy(p, "Hello");

    cout<<*p<<endl; //只是輸出p指向的字串的第一個字元!

    cout<<p<<endl;  //輸出p指向的字串!

    delete[] p;

    return 0;

}

輸出結果:

H

Hello

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 <iostream>

#include <typeinfo>

using namespace std;

int main()

{

    int* a = new int[34];

    int* b = new int[];

    int (*c)[2] = new int[34][2];

    int (*d)[2] = new int[][2];

    int (*e)[2][3] = new int[34][2][3];

    int (*f)[2][3] = new int[][2][3];

    a[0] = 1;

    b[0] = 1; //執行時錯誤,無分配的記憶體,b只起指標的作用,用來指向相應的資料

    c[0][0] = 1;

    d[0][0] = 1; //執行時錯誤,無分配的記憶體,d只起指標的作用,用來指向相應的資料

    e[0][0][0] = 1;

    f[0][0][0] = 1; //執行時錯誤,無分配的記憶體,f只起指標的作用,用來指向相應的資料

    cout<<typeid(a).name()<<endl;

    cout<<typeid(b).name()<<endl;

    cout<<typeid(c).name()<<endl;

    cout<<typeid(d).name()<<endl;

    cout<<typeid(e).name()<<endl;

    cout<<typeid(f).name()<<endl;

    delete[] a;

    delete[] b;

    delete[] c;

    delete[] d;

    delete[] e;

    delete[] f;

}

輸出結果:

int*

int*

int (*)[2]

int (*)[2]

int (*)[2][3]

int (*)[2][3]