首页 > 学院 > 开发设计 > 正文

free、delete与delete[]的使用

2019-11-08 02:24:33
字体:
来源:转载
供稿:网友

free、delete与delete[]的使用

首先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;
上一篇:codeforces 607B dp

下一篇:SpringMvc常用注解

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表