首先new与delete成对出现,自己的代码中需要对自己new出来的东西负责。 一般来说,new一个对象的话delete它就好了,但是new[]的话需要使用delete[],实际上,对于基本类型,new[]之后delete与delete[]差别不大,但是对于对象,由于对象析构函数的存在,delete将只会调用数组第一项的析构函数,而delete[]则会挨着调用它们的析构函数,所以对于数组应该使用delete[]回收内存。 代码:
class A{public: A(){cout<<"constructor"<<endl;} ~A(){cout<<"destructor"<<endl;}};int main(){ auto a=new A[3]; delete a; a=0; cout<<endl; auto b=new A[3]; delete []b; b=0; getchar(); return 0;}__结果:
小结 - 1、delete[]挨个调用了析构函数进行处理,如果类的析构函数中存在一些释放、清除操作的话,错用delete处理new[]就会出现问题甚至内存泄漏 - 2、free与malloc成对出现,与new和delete的区别主要是new会生成空间,并且会调用构造函数,delete调用析构函数并释放空间,而malloc、free只是申请、释放空间而已 - 3、free和delete之后都需要将指针置0,以防止再次访问或者再次清除空间,这很可能会导致程序崩溃和不可预期的结果,很可能会出现很难追踪的bug,而实际上free(0)和delete 0都是合法且不会出问题的 对于如下代码:
auto c=(int*)malloc(sizeof(int)); if(c!=NULL) { free(c); c=0; }由于free(0)是合法并且不会出问题的,所以判断指针合法性也不是必须的,可写为:
auto c=(int*)malloc(sizeof(int)); free(c); c=0;新闻热点
疑难解答