实验目的
掌握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++