博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
new\new[]\delete\delete[]区别
阅读量:4610 次
发布时间:2019-06-09

本文共 975 字,大约阅读时间需要 3 分钟。

一般来说用new []创建的对象要用delete[]销毁(基本类型new[]创建的对象也可以用delete销毁),对于new和delete在实现上还是调用的malloc和free。

对于基本类型在销毁的时候字需要释放malloc申请的空间就可以了;

但是对于类类型销毁的时候除了需要释放malloc申请的空间之外,还需要调用对象的析构函数

在对象中可能有指针成员指向一个动态申请的内存空间,上面提到的释放申请的空间的时候只是释放了这个指针占用的空间,对于指针指向的空间,需要在析构函数中释放。

 

对于基本类型和类类型的new[]和delete[]在实现上稍有差别:

1. 对于基本类型new[]直接调用malloc,delete[]直接调用free,所以delete和delete[]是没有区别的。

2. 对于类类型,new[]除了调用malloc申请空间之外,还会调用构造函数对每一个对象初始化;

更重要的是,对象数组的起始地址不是malloc返回的地址p,而是p后面的四个字节处。

那么p开始的四个字节用来做什么呢?

在这四个字节的地方保存了数组中对象的个数

但是为什么要保存对象的个数呢?

原因就是对象的析构。当用malloc申请内存的时候,系统按照某个大小的块规格分配,那么就可能造成实际分配的空间比我们申请的空间要大。在系统中记录着实际分配的空间大小,当释放这个空间的时候只需要提供这个空间的起始地址,系统就可以正确释放这个空间。

对于基本类型释放实际申请的空间就可以了,但是对于类类型,前面说过了还需要调用析构函数,但是有多少个对象需要调用析构函数呢?系统不能用分配的内存数/对象大小吗?

当然不行,前面说过了,系统记录的是实际分配的空间大小,后面包括了一些我们没有用到的空间。所以一定要记录对象的数目。

 

3. 当类类型调用delete[]的时候,首先从数组起始位置arr的前四个字节取出对象的个数n;

然后依次调用arr,arr+sizeof(object), .......,arr+sizeof(object)*(n-1)位置对象的析构函数;

最后系统通过 (int *)arr - 1地址释放当时malloc申请的实际内存。

转载于:https://www.cnblogs.com/li-xingtao/p/5148956.html

你可能感兴趣的文章
网站建设中帝国cms如何循环调用栏目下级分类
查看>>
php对象的传递——“通过引用传递”or“传递的是object identifier”?
查看>>
windows(msvc)下编译boost库
查看>>
统计文件夹的大小
查看>>
websocket实现群聊和单聊(转)
查看>>
面试简单整理之zookeeper
查看>>
把你的英语用起来-七天行动-置之死的而后生
查看>>
react 原理集合
查看>>
The primitive Java types
查看>>
个人在AS的一些安卓适配经验
查看>>
pat1009
查看>>
Python学习之进程
查看>>
【转载】分析重装系统也无法清除的鬼影病毒
查看>>
阅读笔记3 -代码阅读与实践
查看>>
ubuntu16使用docky替代系统的启动器
查看>>
观看传志播客的两天的微信开发视频的感悟
查看>>
VS中的一些标记
查看>>
Service介绍(MediaPlayer应用)
查看>>
python模块-logging的智商上限
查看>>
链表问题3——大整数相乘
查看>>