C++中delete和delete的区别

 我来答
百度网友fec70a8
2015-07-19 · TA获得超过845个赞
知道小有建树答主
回答量:334
采纳率:0%
帮助的人:160万
展开全部

请问你想问的是不是"delete"与"delete[]"的区别?

两者之间区别的通俗理解是,delete是释放一个单位的堆空间,而delete是删除多个单位堆空间。

比如

int *p1=new int;//释放p1使用delete p1;或者delete[]p1;都是可以的,表示释放1*sizeof(int)个堆空间。

int *p2=new int[10];//如果需要完全释放首地址为p2的堆空间,需要使用delete[]p2;,顺便说一下,delete p2;的结果是p2开始int长度的堆空间被释放,剩下的9*sizeof(int);个堆空间仍然留着。


PS:实际尝试下来(比如VS 2013编译器),针对比如int[],char[]之类的简单数组,delete与delete[]效果完全相同,但是遇到释放class或者struct类型动态空间时候,却会产生不同结果。比如

class test
{
    char *c;
public:
    test()
    {
        c=new char[2];
    }
    ~test()
    {
        delete[]c;//此处使用delete c;也可以。因为c就只有一层堆空间。
    }
};
test *p=new test[10];
delete[]p;
//delete p;

这时候delete p与delete[]p会产生不同结果,前者会直接报错。

感觉是delete[]比delete更加“细心”,也就是delete仅仅停留在表面,而delete[]不但会逐个释放第一层t为首的堆空间,而且在释放前还会读取此空间上存放的地址,进入实体类对象的空间,因此会调用类内的析构函数。

本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式