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