动态内存分配.docx

上传人:太** 文档编号:94154602 上传时间:2023-07-23 格式:DOCX 页数:8 大小:14.89KB
返回 下载 相关 举报
动态内存分配.docx_第1页
第1页 / 共8页
动态内存分配.docx_第2页
第2页 / 共8页
点击查看更多>>
资源描述

《动态内存分配.docx》由会员分享,可在线阅读,更多相关《动态内存分配.docx(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、动态内存安排L堆内存安排:C/C+定义了4个内存区间:代码区,全局变量与静态变量区,局部变量区即栈区, 动态存储区,即堆(he叩)区或自由存储区(free store X堆的概念:通常定义变量(或对象),编译器在编译时都可以依据该变量(或对象)的类型知道所 需内存空间的大小,从而系统在适当的时候为他们安排确定的存储空间。这种内存安排称 为静态存储安排;有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只 能在程序运行时,系统依据运行时的要求进行内存安排,这种方法称为动态存储安排。全 部动态存储安排都在堆区中进行。当程序运行到需要一个动态安排的变量或对象时,必需向系统申请取

2、得堆中的一块所 需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生 命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次安排,做 到重复使用有限的资源。2.堆内存的安排与释放堆空间申请、释放的方法:在C+ +中,申请和释放堆中安排的存贮空间,分别使用new delete的两个运算符 来完成:指针变量名二new类型名(初始化式);delete指针名;例如:1、int *pi = new int(O);它与下列代码序列大体等价:2X int ival=0, *pi=&ival;区分:pi所指向的变量是由库操作符new()安排的,位于程序的堆区中,并且该

3、对象 未命名。堆空间申请、释放说明:(1) .new运算符返回的是一个指向所安排类型变量(对象)的指针。对所创建的变量或 对象,都是通过该指针来间接操作的,而且动态创建的对象本身没出名字。.一般定义变量和对象时要用标识符命名,称命名对象,而动态的称无名对象(请留意 与栈区中的临时对象的区分,两者完全不同:生命期不同,操作方法不同,临时变量对程 序员是透亮的)。.堆区是不会在安排时做自动初始化的(包括清零),所以必需用初始化式(initializer) 来显式初始化。new表达式的操作序列如下:从堆区安排对象,然后用括号中的值初始化 该对象。3 .堆空间申请、释放演示:.用初始化式(initia

4、lizer)来显式初始化int *pi = new int(O);.当pi生命周期结束时,必需释放pi所指向的目标:delete pi;留意这时释放了 pi所指的目标的内存空间,也就是撤销了该目标,称动态内存释放 (dynamic memory deallocation ),但指针pi本身并没有撤销,它自己仍旧存在,该指 针所占内存空间并未释放。下面是关于new操作的说明(1) .new运算符返回的是一个指向所安排类型变量(对象)的指针。对所创建的变量或 对象,都是通过该指针来间接操作的,而动态创建的对象本身没出名字。.一般定义变量和对象时要用标识符命名,称命名对象,而动态的称无名对象(请留意

5、 与栈区中的临时对象的区分,两者完全不同:生命期不同,操作方法不同,临时变量对程 序员是透亮的)。.堆区是不会在安排时做自动初始化的(包括清零),所以必需用初始化式(initializer) 来显式初始化。new表达式的操作序列如下:从堆区安排对象,然后用括号中的值初始化 该对象。4 .在堆中建立动态一维数组申请数组空间:指针变量名二new类型名下标表达式;留意:下标表达式不是常量表达式,即它的值不必在编译时确定,可以在运行时 确定。释放数组空间:delete 指向该数组的指针变量名;留意:方括号特别重要的,假如delete语句中少了方括号,因编译器认为该指针是指 向数组第一个元素的,会产生回

6、收不彻底的问题(只回收了第一个元素所占空间),加了方 括号后就转化为指向数组的指针,回收整个数组。delete 的方括号中不需要填数组元素 数,系统自知。即使写了,编译器也忽视。#include #include int n;char *pc;cout 请输入动态数组的元素个数n;/n在运行时确定,可输入17pc=new charn; 申请17个字符(可装8个汉字和一个结束符)的内存空间strcpy(pc,堆内存的动态安排)7/coutpcendl;delete pc;释放pc所指向的n个字符的内存空间return;)5 .动态一维数组的说明变量n在编译时没有确定的值,而是在运行中输入,按运行

7、时所需安排堆空间,这 一点是动态安排的优点,可克服数组大开小用”的弊端,在表、排序与查找中的算法, 若用动态数组,通用性更佳。肯定留意:delete pc是将n个字符的空间释放,而用delete pc则只释放了一个字符的空间;假如有一个char *pcl,令pcl=p ,同样可用delete pci来释放该空间。尽管 C+不对数组作边界检查,但在堆空间安排时,对数组安排空间大小是纪录在案的。没有初始化式(initializer),不行对数组初始化。6 .指针数组和数组指针指针类型:int*ptr; 指针所指向的类型是int(2)char*ptr; 指针所指向的的类型是charint*ptr;指

8、针所指向的的类型是int* (也就是一个int *型指针)(4)int(*ptr)3;指针所指向的的类型是int()3 二维指针的声明指针数组:一个数组里存放的都是同一个类型的指针,通常我们把他叫做指针数组。比如int* a2;它里边放了 2个int *型变量.int * a2;a0= new int3;al = new int3;delete a0;delete al;留意这里是一个数组,不能delete ;数组指针:一个指向一维或者多维数组的指针.int*b=newint10;指向一维数组的指针b ;留意,这个时候释放空间肯定要delete 口,否则会造成内存泄露,b就成为了空悬指 针in

9、t (*b2)10 = new int1010;留意这里的b2指向了一个二维int型数组的首地址.留意:在这里,b2等效于二维数组名,但没有指出其边界,即最高维的元素数量,但 是它的最低维数的元素数量必需要指定!就像指向字符的指针,即等效一个字符串,不要把 指向字符的指针说成指向字符串的指针。int(*b3) 30 20; 三级指针一指向三维数组的指针;int(*b2) 20;二级指针;一指向二维数组的指针;b3=newint 1 20 30;b2=new int 30 20;删除这两个动态数组可用下式:delete b3; 删除(释放)三维数组;delete b2; 删除(释放)二维数组;在堆中建立动态多维数组new类型名下标表达式1下标表达式2;例如:建立一个动态三维数组float (*cp)3020;指向一个30行20列数组的指针,指向二维数组的指针cp=new float 15 30 20; /建立由 15个30*20数组组成的数组;留意:cp等效于三维数组名,但没有指出其边界,即最高维的元素数量,就像指向字 符的指针即等效一个字符串,不要把指向字符的指针,说成指向字符串的指针。这与数组的 嵌套定义相全都。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 解决方案

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁