new和delete

本文深入解析C++中new和delete运算符的工作原理,包括内存分配与释放机制,以及为何delete能准确释放new分配的内存。同时,探讨了类对象数组在动态分配时额外存储空间的用途,以及delete和delete[]在不同场景下的应用区别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

new和delete是关键字运算符不是函数

new做了两件事,分配内存(调用operator new()函数来分配内存),调用构造函数

delete做了两件事,调用析构函数,释放内存(调用operator delete()函数来释放内存)

为什么delete知道new分配了多少内存需要释放呢,因为new内部有记录机制,会将分配的内存大小额外在一个区域记录下来,delete通过读取这个区域就知道需要释放多少内存

 

当定义了一个占1个字节的类A时,使用A *a = new A[4]时,若最后不delete,结果发现泄露了8个字节,为什么不是4个字节呢,因为对于类类型,每次动态分配内存数组时,需要额外4个字节来存储分配对象的个数,这样便于delete[]来调用多个析构函数。

对于普通的内置类型,int *temp = new int[5] 来说,因为不需要调用析构函数,所以delete和delete[]效果一样。但是类对象数组就一定需要delete[]

如果一个类中无自定义的析构函数,那么编译器就不会额外为它分配4个字节来存储分配对象个数,调用无中括号的delete也不会出错,因为无需调用析构函数。

所以有那四个字节才能用delete[],没有的时候只能用delete。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值