还剩6页未读,继续阅读
文本内容:
动态内存安排L堆内存安排C/C++定义了4个内存区间代码区,全局变量与静态变量区,局部变量区即栈区,动态存储区,即堆(he叩)区或自由存储区(freestoreX堆的概念通常定义变量(或对象),编译器在编译时都可以依据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们安排确定的存储空间这种内存安排称为静态存储安排;有些操作对象只在程序运行时才能确定,这样编译时就无法为他们预定存储空间,只能在程序运行时,系统依据运行时的要求进行内存安排,这种方法称为动态存储安排全部动态存储安排都在堆区中进行当程序运行到需要一个动态安排的变量或对象时,必需向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次安排,做到重复使用有限的资源
2.堆内存的安排与释放堆空间申请、释放的方法:在C++中,申请和释放堆中安排的存贮空间,分别使用newdelete的两个运算符来完成指针变量名二new类型名初始化式;delete指针名;例如
1、int*pi=newintO;它与下列代码序列大体等价2Xintival=0*pi=ival;区分pi所指向的变量是由库操作符new安排的,位于程序的堆区中,并且该对象未命名堆空间申请、释放说明.new运算符返回的是一个指向所安排类型变量对象的指针对所创建的变量或对象,都是通过该指针来间接操作的,而且动态创建的对象本身没出名字⑵.一般定义变量和对象时要用标识符命名,称命名对象,而动态的称无名对象请留意与栈区中的临时对象的区分,两者完全不同生命期不同,操作方法不同,临时变量对程序员是透亮的⑶.堆区是不会在安排时做自动初始化的包括清零,所以必需用初始化式initializer来显式初始化new表达式的操作序列如下从堆区安排对象,然后用括号中的值初始化该对象.堆空间申请、释放演示⑴.用初始化式initializer来显式初始化int*pi=newintO;⑵.当pi生命周期结束时,必需释放pi所指向的目标deletepi;留意这时释放了pi所指的目标的内存空间,也就是撤销了该目标,称动态内存释放dynamicmemorydeallocation,但指针pi本身并没有撤销,它自己仍旧存在,该指针所占内存空间并未释放下面是关于new操作的说明.new运算符返回的是一个指向所安排类型变量对象的指针对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没出名字⑵.一般定义变量和对象时要用标识符命名,称命名对象,而动态的称无名对象请留意与栈区中的临时对象的区分,两者完全不同生命期不同,操作方法不同,临时变量对程序员是透亮的⑶.堆区是不会在安排时做自动初始化的(包括清零),所以必需用初始化式(initializer)来显式初始化new表达式的操作序列如下从堆区安排对象,然后用括号中的值初始化该对象.在堆中建立动态一维数组
①申请数组空间指针变量名二new类型名[下标表达式];留意下标表达式不是常量表达式,即它的值不必在编译时确定,可以在运行时确定
②释放数组空间delete[]指向该数组的指针变量名;留意方括号特别重要的,假如delete语句中少了方括号,因编译器认为该指针是指向数组第一个元素的,会产生回收不彻底的问题(只回收了第一个元素所占空间),加了方括号后就转化为指向数组的指针,回收整个数组delete□的方括号中不需要填数组元素数,系统自知即使写了,编译器也忽视#includeiostream.h#includestring.hintn;char*pc;cout请输入动态数组的元素个数endl;cinn;//n在运行时确定可输入17pc=newchar[n];〃申请17个字符(可装8个汉字和一个结束符)的内存空间strcpy(pc堆内存的动态安排)7/coutpcendl;delete[]pc;〃释放pc所指向的n个字符的内存空间return;).动态一维数组的说明
①变量n在编译时没有确定的值,而是在运行中输入,按运行时所需安排堆空间,这一点是动态安排的优点,可克服数组大开小用”的弊端,在表、排序与查找中的算法,若用动态数组,通用性更佳肯定留意delete[]pc是将n个字符的空间释放,而用deletepc则只释放了一个字符的空间;
②假如有一个char*pcl令pcl=p同样可用delete[]pci来释放该空间尽管C++不对数组作边界检查,但在堆空间安排时对数组安排空间大小是纪录在案的
③没有初始化式initializer不行对数组初始化.指针数组和数组指针指针类型⑴int*ptr;〃指针所指向的类型是int2char*ptr;〃指针所指向的的类型是char⑶int**ptr;〃指针所指向的的类型是int*也就是一个int*型指针4int*ptr
[3];〃指针所指向的的类型是int
[3]〃二维指针的声明指针数组一个数组里存放的都是同一个类型的指针,通常我们把他叫做指针数组比如int*a
[2];它里边放了2个int*型变量.int*a
[2];a
[0]=newint
[3];a[l]=newint
[3];deletea
[0];deletea[l];留意这里是一个数组,不能delete[];数组指针一个指向一维或者多维数组的指针.int*b=newint
[10];指向一维数组的指针b;留意,这个时候释放空间肯定要delete口否则会造成内存泄露,b就成为了空悬指针int*b2
[10]=newint
[10]
[10];留意这里的b2指向了一个二维int型数组的首地址.留意在这里,b2等效于二维数组名,但没有指出其边界,即最高维的元素数量,但是它的最低维数的元素数量必需要指定!就像指向字符的指针,即等效一个字符串不要把指向字符的指针说成指向字符串的指针int*b3
[30]
[20];〃三级指针一>指向三维数组的指针;int*b2
[20];〃二级指针;一〉指向二维数组的指针;b3=newint
[1]
[20]
[30];b2=newint
[30]
[20];删除这两个动态数组可用下式delete[]b3;〃删除释放三维数组;delete[]b2;〃删除释放二维数组;在堆中建立动态多维数组new类型名[下标表达式1][下标表达式2]……;例如建立一个动态三维数组float*cp
[30]
[20];〃指向一个30行20列数组的指针,指向二维数组的指针cp=newfloat
[15]
[30]
[20];//建立由15个30*20数组组成的数组;留意cp等效于三维数组名,但没有指出其边界,即最高维的元素数量,就像指向字符的指针即等效一个字符串,不要把指向字符的指针,说成指向字符串的指针这与数组的嵌套定义相全都。
个人认证
优秀文档
获得点赞 0