C++程序设计——一

实验目的

掌握C++中new、delete的相关知识和使用

实验内容

new可以说是一个关键字,也可以说是一个运算符,并且它可以被重载

new

new operator

这是我们常用的new,先上实验代码
在这里插入图片描述
运行结果如下
在这里插入图片描述
实际上,这里的new执行了三步:
1)调用operator new(后面要说的第二种new)申请内存,若是类本身定义了operator new(即对new进行重载),则会调用类自己的operator new
2)调用构造函数
3)返回相应指针,图中的那一串地址即为指针地址

operator new

operator new不调用构造函数,仅仅分配内存,类似于C语言中的malloc

在这里插入图片描述
结合第一张图可以看出,new operator确实是先调用operator new申请内存,再调用构造函数的

placement new

它允许在已经分配的内存中再构造一个新的对象,这就是所谓的定位放置new(placement new);

如下图,先分配内存空间给一个字符数组,然后在这个已经分配的内存中再次构造一个新的对象,也就是说,placement new不申请内存空间,而是利用已经申请好的空间;

(用定位放置new操作,既可以在栈(stack)上生成对象,也可以在堆(heap)上生成对象。如本例就是在栈上生成一个对象)
在这里插入图片描述
在这里插入图片描述

delete

delete和delete[]

一般来说,教材上会这样写:
delete释放new分配的单个对象指针指向的内存;
delete[]释放new[]分配的一组对象指针指向的内存;

关于 new[] 和 delete[],其中又分为两种情况:
(1) 为基本数据类型分配和回收空间
(2) 为自定义类型分配和回收空间
这里着重讨论第一种情况,我们写两个小程序进行测试
程序一:
使用delete[]释放内存
在这里插入图片描述
在这里插入图片描述
从程序运行结果可以清楚的看到,第一次分配的内存区域0x004106A0-0x004106B0在被delete[]后,其前4个单元,在第二次new[]时又被重新分配,这说明内存区域0x004106A0-0x004106B0在被delete[]后的确已被系统回收!
程序二:
使用delete释放内存,只需要将程序一中的delete[]改为delete即可
在这里插入图片描述
在这里插入图片描述
可以看到,使用delete删除由new[]产生的多个数据单元的运行结果跟使用delete[]时是完全一样的!
这说明,对于基本数据类型,使用delete和delete[]删除由new[]分配的多个数据单元的效果是一样的。

=delete的用法

C++11中,当我们定义一个类的成员函数时,如果后面使用"=delete"去修饰,那么就表示这个函数被定义为已删除的函数,也就意味着这个成员函数不能再被调用,否则就会出错。
如下
在这里插入图片描述
它还可以用来避免隐式转换
在这里插入图片描述
把参数类型是double的重载函数加上=delete进行修饰,表示这个函数被删除,那么用户就不能使用这个函数了,这样再编译就会出错

实验结论

通过此次实验,我们了解了new和delete关键字的使用问题,特别是new的三种用法,这有助于我们更好的使用C++

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值