在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; }