1 / 119
文档名称:

unit07动态分配内存空间.ppt

格式:ppt   大小:1,234KB   页数:119页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

unit07动态分配内存空间.ppt

上传人:yuzonghong1 2018/7/30 文件大小:1.21 MB

下载得到文件列表

unit07动态分配内存空间.ppt

相关文档

文档介绍

文档介绍:第七章动态内存分配与数据结构
本章首先介绍程序运行时动态内存分配(dynamic memory allocation)的概念与方法。进一步讨论复制构造函数.
然后学****更多有关数据结构的基本知识,包括链表,栈,队,二叉树等的基本算法和应用。模板是标准C++实现代码复用的有力工具,特别是有关数据结构的算法,本章继续使用。

(选读)
栈与队列的基本操作及其应用
链表与链表的基本操作
第七章动态内存分配与数据结构


的分配与释放

与构造函数
浅复制与深复制
静态存储分配:
通常定义变量(或对象),编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为它们分配确定的存储空间。
动态存储分配:
有些操作对象只有在程序运行时才能确定,这样编译器在编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,称为动态存储分配。动态分配都在自由存储区中进行。

当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得自由存储区中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能进行再次分配,做到重复使用有限的资源。
申请和释放自由存储区中分配的存贮空间,分别使用new和delete的两个运算符来完成,其使用的格式如下:
指针变量名=new 类型名(初始化式);
delete 指针名;
new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有名字。
动态分配与释放:

一般定义变量和对象时要用标识符命名,称命名对象,而动态的称无名对象(请注意与栈区中的临时对象的区别,两者完全不同:生命期不同,操作方法不同,临时变量对程序员是透明的)。自由存储区是不会自动在分配时做初始化的(包括清零),所以必须用初始化式(initializer)来显式初始化。
new表达式的操作:
从自由存储区分配对象,然后用括号中的值初始化该对象。
分配对象时,new表达式调用库操作符new():
int *pi=new int(0);
pi现在所指向的变量的存储空间是由库操作符new()分配的,位于程序的自由存储区中,并且该对象未命名。
无名对象:

自由存储区
0
Pi
演示:
(initializer)来显式初始化
int *pi=new int(0);
,
必须释放pi所指向的目标:
delete pi;
注意这时释放了pi所指的目标的内存空间,也就是撤销了该目标,称动态内存释放(dynamic memory deallocation),但指针pi本身并没有撤销,该指针所占内存空间并未释放。

动态分配数组的特点:
1. 变量n在编译时没有确定的值,而是在运行中输入,按运行时所需分配空间,这一点是动态分配的优点,可克服数组“大开小用”的弊端,在表、排序与查找中的算法,若用动态数组,通用性更佳。delete [ ]pc是将n个字符的空间释放,而用delete pc则只释放了一个字符的空间;
2. 如果有char *pc1,令pc1=pc,同样可用delete [ ] pc1
来释放该空间。尽管C++不对数组作边界检查,但在自由
存储区空间分配时,对数组分配空间大小是纪录在案的。
3. 没有初始化式(initializer),不可对数组初始化。
(选读)
多维数组动态分配:
new 类型名[下标表达式1] [下标表达式2]……;
建立一个动态三维数组
float (*cp)[30][20] ;
//指向一个30行20列数组的指针
cp=new float [15] [30] [20];
//建立由15个30*20数组组成的数组;
注意cp等效于三维数组名,但没有指出其边界,即最高维的元素数量,就像指向字符的指针即等效一个字符串,不要把指向字符的指针,说成指向字符串的指针。这与数组的嵌套定义相一致。