版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、1第1页/共23页对于计算机程序设计而言,变量和对象在内存中的分配都是编译器在编译程序时安排好的,这带来了极大的不便,如数组必须大开小用,指针必须指向一个已经存在的变量或对象。对于不能确定需要占用多少内存的情况,动态内存分配解决了这个问题。 C/C+定义了4个内存区间:代码区,全局数据区,栈区,堆(heap)区。2第2页/共23页 通常定义变量时,编译器在编译时根据该变量的类型,在适当的时候为他们分配所需的内存空间大小。这种内存分配称为静态存储分配。但有些操作只有在程序运行时才能确定,这样编译器在编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动
2、态存储分配。所有动态存储分配都在堆区中进行。3第3页/共23页全局变量全局变量静态数据静态数据常量常量函数函数 函数运行函数运行时分配的时分配的局部变量、局部变量、函数参数、函数参数、返回数据、返回数据、返回地址返回地址等等内存中剩余的内存中剩余的空间由程序员空间由程序员负责申请和释负责申请和释放在放在C+里堆里堆空间的申请和空间的申请和释放分别用到释放分别用到操作符:操作符:new 和和 delete全局数据区全局数据区data area代码区代码区code area栈区栈区stack area堆区堆区heap area4第4页/共23页 当程序运行到需要一个动态分配的变量或对当程序运行到需
3、要一个动态分配的变量或对象时,必须向系统象时,必须向系统申请取得申请取得堆区中的一块所需堆区中的一块所需大小的存储空间,用于存储该变量或对象。大小的存储空间,用于存储该变量或对象。 当不再使用该变量或对象时,也就是它的生命当不再使用该变量或对象时,也就是它的生命结束时,要结束时,要显式释放显式释放它所占用的存储空间,这它所占用的存储空间,这样系统就能对该堆空间进行再次分配,做到重样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。复使用有限的资源。第5页/共23页 在C+中,申请和释放堆中分配的存储空间,分别使用new和delete这两个运算符来完成,其使用的格式如下:指针变量名=new
4、 类型名(初始值);delete 指针名; new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有标识符名。 6第6页/共23页u一般定义变量和对象时要用标识符命名,称一般定义变量和对象时要用标识符命名,称命名命名对象对象,而动态的称,而动态的称无名对象无名对象。unewnew表达式的操作序列如下:表达式的操作序列如下:从堆区分配对象,从堆区分配对象,然后用括号中的值初始化该对象然后用括号中的值初始化该对象。从堆区分配对。从堆区分配对象时,象时,newnew表达式调用库操作符表达式调用库操作符new()new()。例
5、如:。例如: int int * *pi=new int(0);pi=new int(0);说明:说明:pipi现在所指向的变量是由库操作符现在所指向的变量是由库操作符new()new()分配的,位于程序的堆区中,并且该分配的,位于程序的堆区中,并且该对对象未命名象未命名。 第7页/共23页堆i下面看演示:下面看演示:用初始化式用初始化式(initializer)(initializer)来显式初始化来显式初始化 int int * *pi=new int(0);pi=new int(0);当当pipi生命周期结束时,生命周期结束时,必须释放必须释放pipi所指向的目标:所指向的目标: del
6、ete pi;delete pi;注意这时释放了注意这时释放了pipi所指的目标的内存空间,也就是撤所指的目标的内存空间,也就是撤销了该目标,称动态内存释放(销了该目标,称动态内存释放(dynamic memory dynamic memory deallocationdeallocation),但),但指针指针pipi本身并没有撤销本身并没有撤销,它自己仍,它自己仍然存在,该指针所占内存空间并未释放。然存在,该指针所占内存空间并未释放。 第8页/共23页 使用new运算符时必须已知数据类型,new运算符会向系统堆区申请足够的存储空间,如果申请成功,就返回该内存块的首地址,如果申请不成功,则返
7、回零值。 一般格式格式1:指针变量名=new 类型标识符;格式2:指针变量名=new 类型标识符(初始值);格式3:指针变量名=new 类型标识符内存单元个数;说明:格式1和格式2都是申请分配某一数据类型所占字节数的内存空间;但是格式2在内存分配成功后,同时将一初值存放到该内存单元中;而格式3可同时分配若干个内存单元,相当于形成一个动态数组。9第9页/共23页【例91:利用new对变量进行分配空间】#include using namespace std;void main()char *pc; int *pi;pc=new char;pi=new int(8);*pc=a;coutpcend
8、l;cout*piendl;/格式格式1 1/格式格式2 2a8pcpi如果内存分配失败,则返如果内存分配失败,则返回零值。所以在动态分配回零值。所以在动态分配内存时,应对返回的指针内存时,应对返回的指针进行检查进行检查10/通过指针指向动态分配的内存的首地址通过指针指向动态分配的内存的首地址第10页/共23页 对于数组进行动态分配的格式为:对于数组进行动态分配的格式为:指针变量名指针变量名=new =new 类型名类型名 下标表达式下标表达式;delete delete 指向该数组的指针变量名指向该数组的指针变量名; ;两式中的两式中的方括号方括号是非常重要的,两者必须配对使用,如果是非常重
9、要的,两者必须配对使用,如果deletedelete语句中少了方括号,因编译器认为该指针是指向语句中少了方括号,因编译器认为该指针是指向数组第一个元素的指针,会产生数组第一个元素的指针,会产生回收不彻底回收不彻底的问题(的问题(只只回收了第一个元素所占空间回收了第一个元素所占空间),),加了方括号后就转化为指加了方括号后就转化为指向数组的指针,回收整个数组向数组的指针,回收整个数组。delete delete 的方括号中的方括号中不需要不需要填填数组元素数数组元素数,系统自知。,系统自知。即使写了,编译器也忽略。即使写了,编译器也忽略。请注意请注意“下标表达式下标表达式”不是常量表达式不是常量
10、表达式,即它的值不必,即它的值不必在编译时确定,在编译时确定,可以在运行时确定可以在运行时确定。第11页/共23页【例92:new 运算符为数组分配空间】void main()char * string=new char20;char str20;strcpy(string,It is a string.);strcpy(str,It is a string too.);coutstringendl;coutstrendl;问:内存区域中,栈区怎么变化?堆区怎么变化?12第12页/共23页ItIt堆区堆区栈区栈区strstring13第13页/共23页【例例9 93 3:动态数组的建立与撤销:
11、动态数组的建立与撤销】void main()int n;char *pc;cout请输入动态数组的元素个数n; /在运行时确定,可输入在运行时确定,可输入1717pc=new charn; / /申请申请1717个字符(可装个字符(可装8 8个汉字和一个结束符)的内存空间个汉字和一个结束符)的内存空间strcpy(pc,堆内存的动态分配);coutpcendl;delete pc; /释放释放pcpc所指向的所指向的n n个字符的内存空间个字符的内存空间第14页/共23页使用new运算符分配的内存一定要释放,否则会产生系统内存泄漏。如:void main()char *pc; int *pi;
12、pc=new char;pi=new int(8);*pc=a;coutpcendl;cout*piendl;15第15页/共23页a8pcpi栈区栈区10001001堆区堆区第16页/共23页void main()char *pc=NULL; int *pi;pc=new char;pi=new int(8);*pc=a;coutpcendl;cout*piendl; if(pc) delete pc; if(pi) delete pi;17第17页/共23页if (string=0)return; char str20;strcpy(string,It is a string.); str
13、cpy(str,It is a string too.);coutstringendl;coutstrendl; delete string;18第18页/共23页ItIt堆区堆区栈区栈区strstring回收的空间回收的空间1000100019第19页/共23页20【例94】从键盘输入10个int型数,而后按输入的相反顺序输出它们。要求使用new运算符动态申请数据空间存放数据。程序执行后的输入输出界面为:输入:1 2 3 4 5 6 7 8 9 10运行输出:10 9 8 7 6 5 4 3 2 1 第20页/共23页21void main() int i, *a, *p;a = new int10;coutinput 10 integers:endl;for(i=0; i*(a+i); /也可用ai cout- The result -=a; p-) cout*p ;coutendl; 以变量形式分配内存比较死板。有了以变量形式分配内存比较死板。有了newnew和和delete,delete,就可以实就可以实现一种动态分配内存的形式,即通过指针引用,而内存的现一种动态分配内存的形式,即通过指针引用
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年度消防安全评估与咨询服务合同
- 净水机租赁合同完整版
- 2024年度研发项目技术咨询和服务合同2篇
- 2024年度防腐涂料供应与施工合同
- 2024年度技术开发合同:合作双方的权利与义务3篇
- 班组安全建设课件
- 2024版特许经营合同样本(全新)2篇
- 2024版水泥购销合同(个人用户版)2篇
- 2024年度二手塔吊买卖合同的信息技术支持合同
- 人教版九年级化学第十单元实验活动6酸、碱的化学性质分层作业课件
- 小学数学二年级上册认识时间练习课3市公开课一等奖省名师优质课赛课一等奖课件
- 最新人教版三年级英语上册课件(完美版)Unit 1 Part B 第1课时
- 培养科研素养提高科研能力课件
- 航站楼管理部《机场使用手册》实施细则
- 城市医疗集团管理制度
- 金坛区苏科版二年级上册劳动《08不倒翁》课件
- 三级安全教育培训课件(项目级)
- 永辉超市门店SOP标准作业流程制度规定(五篇)
- 高边坡锚索试验孔基本试验报告
- 研读新课标“数据意识”的培养策略与评价
- 不断提升能源利用效率做好“双碳”工作心得体会
评论
0/150
提交评论