当前位置首页 > 资格/认证考试 > 计算机等级考试
搜柄,搜必应! 快速导航 | 使用教程

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

文档格式:PPT| 33 页|大小 2.57MB|2024-10-31 发布|举报 | 版权申诉
第1页
第2页
第3页
下载文档到电脑,查找使用更方便 还剩页未读,继续阅读>>
1 / 33
此文档下载收益归作者所有 下载文档
  • 版权提示
  • 文本预览
  • 常见问题
  • 计算机基础教研室,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第七章 动态内存分配,主讲人:,XXX,电子邮件:,联系电话:,2024/10/31,1,动态内存分配,本章首先介绍程序运行时,动态内存分配,(,dynamic memory allocation,)的概念与方法;再进一步讨论复制构造函数,.,7.1.1,自由存储区,内存,的分配与释放,7.1.2,自由存储区,对象,与构造函数,7.1.3,浅复制与深复制,2024/10/31,2,计算机基础教研室,自由存储区内存分配,静态存储分配:,无论全局或局部变量,(,对象,),,编译器在,编译时,都可以根据该变量,(,对象,),的类型知道所需内存空间的大小,从而系统在适当的时候为它们分配确定的存储空间尤其是数组动态存储分配:,有些操作对象只有在程序,运行时,才能确定,这样编译器在编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,称为动态存储分配动态分配都在,自由存储区,中进行2024/10/31,3,计算机基础教研室,自由存储区,内存的分配与释放,当程序运行到需要动态分配变量或对象时,必须向系统,申请取得自由存储区,中的一块所需大小的存贮空间,用于存贮该变量或对象。

    当不再使用该变量或对象时,也就是它的生命结束时,要,显式释放,它所占用的存贮空间,这样系统就能进行再次分配,做到重复使用有限的资源动态分配与释放:,2024/10/31,4,计算机基础教研室,一般定义变量和对象时要用标识符命名,称,命名对象,,而动态的称,无名对象,(,请注意与栈区中的临时对象的区别,两者完全不同:生命期不同,操作方法不同,临时变量对程序员是透明的,),自由存储区,是不会自动在分配时做初始化的(包括清零),所以必须用初始化式,(initializer),来显式初始化无名对象:,自由存储区,内存的分配与释放,2024/10/31,6,计算机基础教研室,new,表达式的操作:,从自由存储区分配对象,然后用括号中的值初始化该对象,分配对象时,,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 deallocation,),但,指针,pi,本身并没有撤销,,该指针所占内存空间并未释放。

    自由存储区,内存的分配与释放,2024/10/31,8,计算机基础教研室,动态分配数组与,标准字符串类,:,标准字符串类,string,就是采用动态建立数组的方式解决数组溢出的问题的,例,7.1,所做的动态内存分配与释放,在,string,类对象中都是自动完成的,在程序中不需要也不允许再显式地为,string,进行动态内存的分配与释放例,7.1】,动态数组的建立与撤销,自由存储区,内存的分配与释放,2024/10/31,10,计算机基础教研室,【,例,7.1,】,动态数组的建立与撤销,#include,#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,(,delete,p;,)实际意思是删除了,p,所指的目标(变量或对象等),释放了它所占的自由存储区空间,而不是删除本身,释放自由存储区空间后,成了空悬指针空悬指针是程序错误的一个根源)建议这时将置空(,NULL,)自由存储区,内存的分配与释放,指针使用的要点:,2024/10/31,13,计算机基础教研室,5,内存泄漏(,memory leak,)和重复释放,new,与,delete,是配对使用的,,delete,只能释放,自由存储区,空间如果,new,返回的指针值丢失,则所分配的,自由存储区,空间无法回收,称内存泄漏,同一空间重复释放也是危险的,因为,该空间可能已另分配,,所以必须妥善保存,new,返回的指针,以保证不发生内存泄漏,也必须保证不会重复释放,自由存储区,内存空间自由存储区,内存的分配与释放,指针使用的要点:,2024/10/31,15,计算机基础教研室,自由存储区,对象与构造函数,类对象动态建立与删除过程:,通过,new,建立的对象要调用构造函数,通过,delete,删除对象也要调用析构函数CGoods*pc;,pc=new CGoods;,/,分配自由存储区空间,并构造一个无名的,CGoods,对象;,.,delete pc;,/,先析构,然后将内存空间返回给自由存储区;,自由存储区,对象的生命期并不依赖于建立它的作用域,所以除非程序结束,,自由存储区,对象(无名对象)的生命期不会到期,并且需要显式地用,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;,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;,/,动态建立数组,不能初始化,调用,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;,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:,Constructor called.,Destructor called.,21,例,6-16,动态创建对象举例,2024/10/31,21,计算机基础教研室,浅复制(浅拷贝),实现对象间数据元素的一一对应复制。

    深复制(深拷贝),当被复制的对象数据成员是指针类型时,不是复制该指针成员本身,而是将指针所指的对象进行复制浅复制与深复制,2024/10/31,22,计算机基础教研室,当,浅复制,析构时,如用默认的析构函数,则动态分配的,自由存储区,对象不能回收如果在析构函数中有“,delete p;,”,语句,则如果先析构函数,obj1,时,,自由存储区,对象已经释放,以后再析构,obj2,时出现了二次释放的问题自由存储区,对象,P,P,自由存储区,对象,图,7.2,深复制,深复制:,重新定义复制的构造函数,给每个对象独立分配一个,自由存储区,对象,称,深复制,这时先复制对象主体,再为,obj2,分配一个,自由存储区,对象,最后用,obj1,的,自由存储区,对象复制,obj2,的,自由存储区,对象obj1,obj2,浅复制与深复制,2024/10/31,24,计算机基础教研室,浅复制与深复制,【,例,7.4】,定义复制构造函数,(,copy structor,)和复制赋值操作符(,copy Assignment Operator,)实现深复制学生类定义:,class,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,默认“,endl;,带参数,构造函数:,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。

    点击阅读更多内容
    卖家[上传人]:沈阳哈登
    资质:实名认证
    相关文档
    正为您匹配相似的精品文档