第七章-动态内存分配--C++程序设计-计算机等级考试教学课件



《第七章-动态内存分配--C++程序设计-计算机等级考试教学课件》由会员分享,可在线阅读,更多相关《第七章-动态内存分配--C++程序设计-计算机等级考试教学课件(33页珍藏版)》请在装配图网上搜索。
1、*,计算机基础教研室,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第七章 动态内存分配,主讲人:,XXX,电子邮件:,联系电话:,2024/10/31,1,动态内存分配,本章首先介绍程序运行时,动态内存分配,(,dynamic memory allocation,)的概念与方法;再进一步讨论复制构造函数,.,7.1.1,自由存储区,内存,的分配与释放,7.1.2,自由存储区,对象,与构造函数,7.1.3,浅复制与深复制,2024/10/31,2,计算机基础教研室,自由存储区内存分配,静态存储分配:,无论全局或局部变量,(,对象,),,编译器在,编译时
2、,都可以根据该变量,(,对象,),的类型知道所需内存空间的大小,从而系统在适当的时候为它们分配确定的存储空间。尤其是数组。,动态存储分配:,有些操作对象只有在程序,运行时,才能确定,这样编译器在编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,称为动态存储分配。动态分配都在,自由存储区,中进行。,2024/10/31,3,计算机基础教研室,自由存储区,内存的分配与释放,当程序运行到需要动态分配变量或对象时,必须向系统,申请取得自由存储区,中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要,显式释放,它所占用的存
3、贮空间,这样系统就能进行再次分配,做到重复使用有限的资源。,动态分配与释放:,2024/10/31,4,计算机基础教研室,一般定义变量和对象时要用标识符命名,称,命名对象,,而动态的称,无名对象,(,请注意与栈区中的临时对象的区别,两者完全不同:生命期不同,操作方法不同,临时变量对程序员是透明的,),。,自由存储区,是不会自动在分配时做初始化的(包括清零),所以必须用初始化式,(initializer),来显式初始化。,无名对象:,自由存储区,内存的分配与释放,2024/10/31,6,计算机基础教研室,new,表达式的操作:,从自由存储区分配对象,然后用括号中的值初始化该对象,。,分配对象时
4、,,new,表达式调用库操作符,new,(),:,int,*pi=,new,int,(0);,pi,现在所指向的变量的存储空间是由库操作符,new,(),分配的,位于程序的自由存储区中,并且该对象未命名。,自由存储区,内存的分配与释放,2024/10/31,7,计算机基础教研室,自由存储区,i,演示:,用初始化式,(initializer),来显式初始化,int,*pi=,new,int,(0);,当,pi,生命周期结束时,,必须释放,pi,所指向的目标:,delete,pi;,注意这时释放了,pi,所指的目标的内存空间,也就是撤销了该目标,称动态内存释放(,dynamic memory de
5、allocation,),但,指针,pi,本身并没有撤销,,该指针所占内存空间并未释放。,自由存储区,内存的分配与释放,2024/10/31,8,计算机基础教研室,动态分配数组与,标准字符串类,:,标准字符串类,string,就是采用动态建立数组的方式解决数组溢出的问题的,例,7.1,所做的动态内存分配与释放,在,string,类对象中都是自动完成的,在程序中不需要也不允许再显式地为,string,进行动态内存的分配与释放。,【,例,7.1】,动态数组的建立与撤销,自由存储区,内存的分配与释放,2024/10/31,10,计算机基础教研室,【,例,7.1,】,动态数组的建立与撤销,#inclu
6、de,#include,using namespace,std,;,int,main(),int,n;,char,*pc;,cout,请输入动态数组的元素个数,n;,/,在运行时确定,可输入,25,pc=,new char,n;,strcpy(pc,自由存储区内存的动态分配,);,coutpcendl;,delete,pc;,/,释放,pc,所指向的,n,个字符的内存空间,return,0;,2024/10/31,11,计算机基础教研室,1.,动态分配失败,。返回一个空指针(,NULL,),表示发生了异常,堆资源不足,分配失败。,2.,指针删除与自由存储区空间释放,。删除一个指针,p,(,de
7、lete,p;,)实际意思是删除了,p,所指的目标(变量或对象等),释放了它所占的自由存储区空间,而不是删除本身,释放自由存储区空间后,成了空悬指针。空悬指针是程序错误的一个根源)。建议这时将置空(,NULL,)。,自由存储区,内存的分配与释放,指针使用的要点:,2024/10/31,13,计算机基础教研室,5,内存泄漏(,memory leak,)和重复释放,。,new,与,delete,是配对使用的,,delete,只能释放,自由存储区,空间。如果,new,返回的指针值丢失,则所分配的,自由存储区,空间无法回收,称内存泄漏,同一空间重复释放也是危险的,因为,该空间可能已另分配,,所以必须妥
8、善保存,new,返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放,自由存储区,内存空间。,自由存储区,内存的分配与释放,指针使用的要点:,2024/10/31,15,计算机基础教研室,自由存储区,对象与构造函数,类对象动态建立与删除过程:,通过,new,建立的对象要调用构造函数,通过,delete,删除对象也要调用析构函数。,CGoods*pc;,pc=new CGoods;,/,分配自由存储区空间,并构造一个无名的,CGoods,对象;,.,delete pc;,/,先析构,然后将内存空间返回给自由存储区;,自由存储区,对象的生命期并不依赖于建立它的作用域,所以除非程序结束,,自由存
9、储区,对象(无名对象)的生命期不会到期,并且需要显式地用,delete,语句析构该类对象,上例执行,delete,语句时,,C+,自动调用商品类的析构函数。,2024/10/31,16,计算机基础教研室,类说明:,class,CGoods,string Name;,int,Amount;,float,Price;,float,Total_value;,public:,CGoods()cout,调用默认构造函数,endl;,CGoods(string name,int,amount,float,price),cout,调用三参数构造函数,endl;,Name=name;Amount=amount
10、;,Price=price;Total_value=price*amount;,CGoods()cout,调用析构函数,endl;,;,【,例,7.3】,演示自由存储区对象分配和释放。,2024/10/31,18,计算机基础教研室,使用:,int,main(),int,n;,CGoods*pc,*pc1,*pc2;,pc=,new,CGoods(,“,夏利,2000,”,,,10,,,118000);,/,调用三参数构造函数,pc1=,new,CGoods();,/,调用默认构造函数,cout,输入商品类数组元素数,n;,pc2=,new,CGoodsn;,/,动态建立数组,不能初始化,调用,
11、n,次默认构造函数,delete,pc;,delete,pc1;,delete,pc2;,return,0;,2024/10/31,19,计算机基础教研室,例,6-16,动态创建对象举例,#include,using namespace std;,class Point,public:,Point(),X=Y=0;coutDefault Constructor called.n;,Point(int xx,int yy),X=xx;Y=yy;cout Constructor called.n;,Point()coutDestructor called.n;,int GetX()return X
12、;,int GetY()return Y;,void Move(int x,int y)X=x;Y=y;,private:,int X,Y;,;,2024/10/31,20,计算机基础教研室,int main(),coutStep One:endl;,Point*Ptr1=new Point;,delete Ptr1;,coutStep Two:endl;,Ptr1=new Point(1,2);,delete Ptr1;,return 0;,运行结果:,Step One:,Default Constructor called.,Destructor called.,Step Two:,Con
13、structor called.,Destructor called.,21,例,6-16,动态创建对象举例,2024/10/31,21,计算机基础教研室,浅复制(浅拷贝),实现对象间数据元素的一一对应复制。,深复制(深拷贝),当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制。,浅复制与深复制,2024/10/31,22,计算机基础教研室,当,浅复制,析构时,如用默认的析构函数,则动态分配的,自由存储区,对象不能回收。如果在析构函数中有“,delete p;,”,语句,则如果先析构函数,obj1,时,,自由存储区,对象已经释放,以后再析构,obj2,时出
14、现了二次释放的问题。,自由存储区,对象,P,P,自由存储区,对象,图,7.2,深复制,深复制:,重新定义复制的构造函数,给每个对象独立分配一个,自由存储区,对象,称,深复制,。,这时先复制对象主体,再为,obj2,分配一个,自由存储区,对象,最后用,obj1,的,自由存储区,对象复制,obj2,的,自由存储区,对象。,obj1,obj2,浅复制与深复制,2024/10/31,24,计算机基础教研室,浅复制与深复制,【,例,7.4】,定义复制构造函数,(,copy structor,)和复制赋值操作符(,copy Assignment Operator,)实现深复制。,学生类定义:,class,
15、student,char,*pName;,/,为了演示深复制,不用,string,类,public,:,student();,/,默认构造函数,student(char*pname);,/,带参数,构造函数,student(student,/,复制构造函数,student();,/,析构函数,student&,operator,=(student,/,复制赋值操作符,检验,主函数,和,运行结果,2024/10/31,25,计算机基础教研室,例,7.4,实现深复制,默认构造函数:,student:student(),coutConstructor;,pName=NULL;,cout,默认“,en
16、dl;,带参数,构造函数:,student:student(,char,*pname),coutConstructor;,if,(pName=,new,char,strlen(pname)+1),strcpy(pName,pname);,coutpNameendl;,2024/10/31,26,计算机基础教研室,例,7.4,实现深复制,复制赋值操作符:,student&student:,operator,=(student&s),coutCopy Assign operator;,delete,pName,;/,如原来已分配,应先撤销,再重分配,if,(s.pName),/,否则会发生内存泄漏,if,(pName=,new,char,strlen(s.pName)+1),strcpy(pName,s.pName);,else,pName=NULL;,coutpNameendl;,return,*,this,;,2024/10/31,28,计算机基础教研室,例,7.4,实现深复制,int,main(,void,),student s1(,范英明,),s2(,沈俊,),s3;,studen
- 温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 踏春寻趣 乐享时光——春季旅游踏春出游活动
- 清明假期至安全不缺席风起正清明安全需守护
- 全国党员教育培训工作规划
- XX中小学公共卫生培训树立文明卫生意识养成良好卫生习惯
- 小学生常见传染病预防知识培训传染病的预防措施
- 3月18日全国爱肝日中西医结合逆转肝硬化
- 肝病健康宣教守护您的肝脏健康如何预防肝炎
- 垃圾分类小课堂教育绿色小卫士分类大行动
- 中小学班主任经验交流从胜任到优秀身为世范为人师表 立责于心履责于行
- 教师数字化转型理解与感悟教师数字化转型的策略与建议
- 团建小游戏团建破冰小游戏团队协作破冰游戏多人互动
- 教师使用deepseek使用攻略让备课效能提升
- 办公室会议纪要培训会议内容会议整理公文攥写
- 党员要注重培塑忠诚奋斗奉献的人格力量
- 橙色卡通风儿童春季趣味运动会