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

上传人:沈*** 文档编号:249799233 上传时间:2024-10-31 格式:PPT 页数:33 大小:2.57MB
收藏 版权申诉 举报 下载
第七章-动态内存分配--C++程序设计-计算机等级考试教学课件_第1页
第1页 / 共33页
第七章-动态内存分配--C++程序设计-计算机等级考试教学课件_第2页
第2页 / 共33页
第七章-动态内存分配--C++程序设计-计算机等级考试教学课件_第3页
第3页 / 共33页
资源描述:

《第七章-动态内存分配--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. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

相关资源

更多
正为您匹配相似的精品文档
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  sobing.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!