delete和delete[]的区别

突然又用到了指针数组,然后在释放的时候,想起了delete和delete[],都说指针数组释放用delete[],结果都试了下发现两个似乎是一样的,就以为是C++哪个版本改过了,跑去搜了下,发现并没有改动的记录,不过两者的实际使用并不完全像教科书上说的那样,自己试验了之后在此做个记录。

先说搜到的结论:搜到的文章说对于基本数据类型,两者效果相同;对于内部无指针变量的自定义类型,两者效果相同;对于内部有指针变量的自定义类型,delete会导致内存溢出,需要使用delete[]。

一、对于基本数据类型

这里我创建一个Qt Widget项目,窗口中只有一个Button,每次点击的时候new 100000个int,new 100000个char,new 100000个double。

先不进行delete:
在这里插入图片描述
初始状态下:
在这里插入图片描述
点击多次后:
在这里插入图片描述

再将上图代码中的delete解除注释:
再次运行,点击多次后,内存占用略微上浮,然后保持不变:
在这里插入图片描述再将上图代码中的delete改为delete[]:
点击多次后,效果与使用delete一致:
在这里插入图片描述
结论:对于基本数据类型,两者效果相同。

一、对于自定义类型

1、没有指针成员的自定义类型

增加一个简单的类。
在这里插入图片描述
并将Button触发执行的代码略作修改。
先不进行delete:
在这里插入图片描述
初始状态与基本类型一致。
点击多次后:
在这里插入图片描述
再将上图代码中的delete解除注释:
再次运行,点击后,程序报错:
在这里插入图片描述
再将上图代码中的delete改为delete[]:
点击没有问题,多次点击后,内存占用没有变化:
在这里插入图片描述
结论:对于自定义类型,delete无法使用,只能用delete[]。

2、有指针成员的自定义类型

结果显而易见就不再试验了。


不知道跟C++版本有没有关系,我这里自定义类型使用delete会直接报错,但是搜到的文章是可以的。
文章里总结了一句话:

new先分配内存,再调用构造函数。delete先调用析构函数,再释放内存。delete只会调用数组第一个对象的析构函数,而delete[]会调用数组中所有对象的析构函数。

参考文章:https://segmentfault.com/a/1190000016128411

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值