现在的位置: 首页 > 综合 > 正文

C++ 中delete运算符与delete[]运算符的区别

2018年03月16日 ⁄ 综合 ⁄ 共 874字 ⁄ 字号 评论关闭

在C/C++中,没有资源回收机制,需要自己完成资源的分配和回收,在C/C++中资源分配使用的好坏也是衡量一个程序员功底的标准之一。
在C语言中,内存的分配和释放用malloc和free两个库函数,在C++中,这两个函数仍然使用,可以完成内存的分配,但是这两个函数已经不能满足C++对对象的创建需要,因为C++,创建一个对象不仅要完成分配资源的需要,还需要执行对象的构造函数,同时在资源释放的时候,还需要执行析构函数,在C++对象的创建和释放使用new和delete操作符,注意这里是操作符。
之前没有使用delete[],所以也不知道与delete的区别,因为平时使用的时候都是使用malloc分配内存,偶尔也用new分配基本类型的数组,但是在资源释放的时候,使用delete也行,使用delete[],以为二者就是一样的。
最近在做面试题时才发现两者原来是不同的:
1、对于基本数据类型(char、int、double等),分配数组时,使用delete和delete[] 都可以完成资源的回收的。
2、对于自定义类时,分配对象数组时,使用delete仅仅回收第一个数组中第一个对象,使用delete[]可以完成整个数组的回收。

int main()
{
    CBase *pTmp1=new CDerivedA ;
    pTmp1->Walk();
    pTmp1->Run(20);
    CDerivedA *pTmp2=(CDerivedA*)pTmp1 ;
    pTmp2->Run(20,3);//合法的
    //pTmp1->Run(20,3);//不合法
    CBase *pTmp3=new CDerivedA[10] ;
    CBase *pTmp4=&(pTmp3[1]) ;
    //delete (pTmp3+1) ;
//    delete[] pTmp3 ;//合法的
//    pTmp4=pTmp3;
//    for(int i=0;i<10;i++)
//    {
//        pTmp3++ ;
//        delete pTmp4 ;
//        pTmp4=pTmp3 ;
//    }//合法的
    delete[] (pTmp3+1) ;//不合法的
    delete pTmp3 ;
    return 0;
}

抱歉!评论已关闭.