突然又用到了指针数组,然后在释放的时候,想起了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