申請內(nèi)存空間,delete和delete[]的區(qū)別

字號:

一道面試題是關(guān)于內(nèi)存空間的申請
    char *p=NULL;
    p=new char[10];
    delete p;
    這是道改錯題,在網(wǎng)上看到delete后沒有[]是釋放數(shù)組的空間,以為這句話有錯就改成
    delete []p;
    后還想想好象也沒錯就劃了沒改,今天用了一小天的時間研究了下這個問題。
    void main()
    {
    char *p=NULL;
    p=new char[10];
    delete[] p;
    //delete p;
    }
    對于簡單的數(shù)據(jù)類型delete []p 和 delete p是一樣的。以為在p=new char[10]的時候在p前13-16位代表數(shù)組的大小(
    前1-12位不知道表示啥)delete p可以知道數(shù)組的大小所以delete []p和delete p結(jié)果一樣。但對于對象數(shù)組就不一樣
    了如:
    void main()
    {
    class a
    {
    public :
    char *m_pName;
    a()
    {
    m_pName=new char[5];
    cout<<"a()"<    }
    ~a()
    {
    delete []m_pName;
    cout<<"~a()"<    }
    };
    a* c=NULL;
    c=new a[2];
    delete []c;
    }
    如果用delete c的話可以釋放a[0]的空間時執(zhí)行~a()結(jié)束時會報錯,具體原因沒查到。看見有的帖子說在<>和<>中有詳細的介紹??荚?大提示如果沒有析構(gòu)函數(shù)不報錯。
    但還是new[] 和delete[]。new和delete成對的用好。
    關(guān)于malloc和free是c語言里的new和delete是c++里的申請內(nèi)存操作。