欢迎来到天天文库
浏览记录
ID:50041220
大小:572.00 KB
页数:50页
时间:2020-03-08
《C++程序设计 教学课件 作者 郑莉第9章 动态内存分配.ppt》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、1第9章动态内存分配清华大学郑莉2目录9.1动态内存分配与释放9.2浅拷贝与深拷贝3第9章动态内存分配使用数组的时候遇到的问题:在使用数组之前并不能或者不容易确定数组的大小,但C++的数组定义却要求必须在定义时就确定好数组的大小。一般预估一个数组的大小,但是如果预估的数组大小太大,就会造成内存的浪费;如果预估太小,则会直接影响数据的处理。有没有可能解决这个问题,让数组的大小可以动态的进行分配呢?4第9章动态内存分配有时候会想要使用很大的数组,比如在main函数中定义一个长度为100,0000的整型数组。这时虽然程序编译会通过,但却会
2、出运行时错误:因为这个整型数组是定义在主函数的栈上的,由于栈空间有限,无法应付这么大的数组。如果我们非要使用这么大的数组又该怎么办呢?59.1动态内存分配与释放解决上述两个问题,可以采用C++提供的动态内存分配技术。动态内存分配技术是在程序运行时,按照需求随时在堆上动态的分配一块内存空间供程序使用,在使用完毕后再由程序释放以保证这块内存空间可以用作其它用途。被动态申请和释放的存储单元称为堆对象,申请和释放这两个过程一般被分别称为建立和删除。第9章动态内存分配69.1.1new运算和delete运算new运算:在C++语言中我们可以使
3、用new运算符进行内存的动态分配,称堆对象的动态创建。其语法格式如下:new运算的作用就是在程序运行到该运算的时候,申请分配一块用于存储相应数据类型的内存空间,如果申请成功的话,就使用初值列表中的值对这块内存空间进行初始化,并返回这块内存空间的首地址。9.1动态内存分配与释放new数据类型(初值列表);79.1.1new运算和delete运算new运算必须将其返回的值赋给一个指针才可以保证后续使用与内存释放;如果内存空间申请失败的话,则编译器会抛出异常(关于异常处理会在第15章进行介绍),有些编译器则返回空指针。在内存动态分配的过程
4、中,如何用初值列表中的值对内存空间进行初始化因数据类型而异。如果申请的内存空间是用于存储基本数据类型的,那么初始化的过程就是用初值列表中的值为这块内存空间赋值。9.1动态内存分配与释放89.1.1new运算和delete运算例如:这一句动态地申请了一块用于存放一个double类型值的内存空间(对double类型而言是8个字节),然后把值4.0存入这块内存空间,并将该空间的首地址值用来初始化(赋值给)指针变量p。9.1动态内存分配与释放double*p=newdouble(4.0);99.1.1new运算和delete运算如果申请的内
5、存空间是用于存储类的对象的,那么初始化的过程调用相应类的构造函数。例如:9.1动态内存分配与释放classTime{public:inthour,minute,second;Time():hour(0),minute(0),second(0){}Time(inta,intb,intc):hour(a),minute(b),second(c){}~Time(){}};Time*p1=newTime();Time*p2=newTime(2,34,22);109.1.1new运算和delete运算上面的第一个动态内存分配语句申请了一块用于
6、存储一个Time类的对象的内存空间,由于初值列表为空,所以调用Time类的无参数值的构造函数,然后将得到的对象存入这块内存空间,并将该空间的首地址用来初始化(赋值给)指针变量p1;第二个动态内存分配语句由于初值列表中有三个数值,所以使用这三个初值来调用Time类的有三个参数值的构造函数。9.1动态内存分配与释放119.1.1new运算和delete运算delete运算:当用new运算申请的内存空间使用完毕后,应使用delete运算符进行内存的动态释放,或者说堆对象的动态删除,其语法格式如下:例如:从delete运算的语法格式可以看到
7、,要想正常的进行内存的动态释放,就必须将new运算得到的地址值赋值给一个指针变量。9.1动态内存分配与释放delete指针变量名;int*p=newint(10);deletep;129.1.1new运算和delete运算delete运算允许在一个delete运算符后面同时释放多个指针变量,各个指针变量之间以逗号分隔。例如:delete运算的作用是当程序运行到该运算时,释放语句中指针变量名指向的内存空间。如果要释放的内存空间是存储基本数据类型的,仅仅将这块内存空间释放;如果要释放的内存空间是存储类的对象的,那么系统会首先调用相应类的
8、析构函数,然后将这块内存空间释放。9.1动态内存分配与释放int*p=newint(10),*q=newint(8);deletep,q;139.1.1new运算和delete运算普通变量、数组、指针变量、类的对象的定义等属于非动态内
此文档下载收益归作者所有