━━动态内存分配.ppt_第1页
━━动态内存分配.ppt_第2页
━━动态内存分配.ppt_第3页
━━动态内存分配.ppt_第4页
━━动态内存分配.ppt_第5页
已阅读5页,还剩26页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

C+程序设计 第7章(1) 动态内存分配 1 主要内容 l C+的四个内存区域 l 动态存储分配 l 堆内存 l new 与 delete 运算符 l 动态存储分配的几点说明 l 使用 new 和 delete 的几点说明 l 动态创建对象 l 对象的浅拷贝、浅赋值 l 对象的深拷贝、深赋值 l 顺序表类模板的定义 2 C+的四个内存区域 l C+的四个内存区域: 代码区存放程序代码。 静态数据区存放全局变量或对象、static局部变量或对象。全局变量或对象在程 序开始运行时在该区分配; static局部变量或对象在程序运行过程中第一次进入其作 用域时在该区分配。该区的变量或对象直到程序运行结束才被释放。 局部数据区(栈区) 存放auto局部变量或对象 。 auto局部变量或对象在程序 运行到其作用域时在栈区分配,但怎样分配在编译时就已经确定。auto局部变量或 对象在离开其作用域时即被释放。 动态存储区(自由存储区、堆区) 存放程序运行过程中由 new 运算符动态创建 的变量或对象 。动态创建的变量或对象在编译时无法为其预定存储空间,系统根据 运行时的具体要求在该区分配。该区的变量或对象需要使用 delete 运算符才能将其 释放。 3 动态存储分配 l 静态存储分配: 通常程序中定义的变量或对象,编译器在编译时就可根据该变量或对象的类型知道 其所需内存空间的大小,即怎样分配在编译时就已经能够确定,从而在适当的时候 为它们分配确定的内存空间,这种内存分配称为静态存储分配。 l 动态存储分配: 有些变量或对象只有在程序运行过程中才能确定其大小,这样编译器在编译时就无 法为它们预定内存空间,只能在程序运行过程中,系统根据运行时的具体要求进行 内存分配,称为动态存储分配。动态存储分配是在自由存储区(堆区)中进行。 4 堆内存 l 关于堆内存: 堆区是由操作系统直接管理的内存区域,它是“公共的区域”,而且“面积”比较大, 它的“生命周期”也不是由编译系统控制的,而是由编程的人控制的。在许多的应用 中,堆内存的使用都是必不可少的。必须通过指针,才可以使用堆内存。 l 堆内存的分配与释放: 在程序运行过程中,遇到一个需要动态分配的变量或对象时,必须向系统申请取得 堆内存中的一块所需大小的内存空间,用于存放该变量或对象。当不再使用该变量 或对象时,必须结束它的生命期,需要显式释放其所占用的内存空间。C+中,取得 和释放堆内存中的空间,分别通过 new 和 delete 运算符来完成。new 用来动态分 配内存空间, delete 用来将动态分配得到的内存空间归还给系统(释放)。 5 new 与 delete 运算符 l new 运算符动态申请堆空间 格式1: 指针变量 = new 类型名 ; 格式2: 指针变量 = new 类型名 ( 初始值 ) ; 功能:动态创建一个指定类型的变量或对象。若创建成功(堆空间申请成功), new 运算返回新分配堆空间的首地址;若创建失败(堆空间申请失败), new 运算 返回 0 或 NULL(空指针)。 l delete 运算符动态释放堆空间 格式: delete 指针 ; 功能:释放由 new 运算动态创建的变量或对象。指针的值必须是 new 运算所分配 堆空间的首地址,即 new 运算的返回值。 6 new 与 delete 运算符 l new 运算符动态创建一维数组 格式: 指针变量 = new 类型名 下标表达式 ; 功能:动态创建一个指定类型的一维数组,数组元素的个数为下标表达式的值。若 创建成功(堆空间申请成功),new 运算返回新分配一维数组空间的首地址;若创 建失败(堆空间申请失败), new 运算返回 0 或 NULL(空指针)。 注意:动态为数组分配堆空间时,不能同时进行初始化。 l delete 运算符动态释放一维数组 格式: delete 指针 ; 功能:释放由 new 运算动态创建的一维数组。指针的值必须是 new 运算所分配一 维数组空间的首地址,且前面必须加上一对方括号 “ ”。 注意:若 delete 中的方括号“ ”不写,只是释放一维数组中一个元素的空间。 7 【例】(动态创建变量) #include void main ( ) int * p = new int ( 100 ) ; cout void main ( ) int * p = new int 6 ; cout p i ; for ( i=0 ; i void main ( ) float ( *p1 ) 3 = new float 2 3 ; int i , j ; cout p1 i j ; for ( i=0 ; i p2 i ; for ( i=0 ; i # include class Student int id ; char name 8 ; int score ; public: Student ( int i=0, char *na=0, int s=0 ) id = i ; strcpy( name, na ) ; score = s ; cout print( ) ; delete p1 ; Student *p2 = new Student ( 222 , “王红” , 88 ) ; p2-print( ); /注意:此处漏写 delete p2; 运行: 对象地址=4390992 构造 ( 张军 ) 了! 学号=111 姓名=张军 成绩=99 对象地址=4390992 析构 ( 张军 ) 了! 对象地址=4390992 构造 ( 王红 ) 了! 学号=222 姓名=王红 成绩=88 15 【例】( 点类、new创建动态对象数组,delete释放动态对象数组) # include # include class Point float x , y ; public: Point ( float a=0 , float b=0 ) x = a ; y = b ; cout x y ; void print ( ) cout input( ) ; for ( i=0 ; i class Point float x , y ; public: Point ( float a=0 , float b=0 ) : x( a ) , y( b ) void print ( ) cout # include class mystring char *ps ; /指向动态分配在堆区的字符串 public: mystring ( char *s=0 ) if ( s ) ps = new char strlen( s ) + 1 ; strcpy( ps , s ) ; else ps = 0 ; void show( ) if ( ps ) cout # include class mystring char *ps ; /指向动态分配在堆区的字符串 public: mystring ( char *s=0 ) if ( s ) ps = new char strlen( s ) + 1 ; strcpy( ps , s ) ; else ps = 0 ; mystring ( ) if ( ps ) delete ps ; /自定义析构函数 void show( ) if ( ps ) cout # include class mystring char *ps ; /指向动态分配在堆区的字符串 public: mystring ( char *s=0 ) /用C风格字符串来初始化mystring类的对象 if ( s ) ps = new char strlen( s ) + 1 ; strcpy( ps , s ) ; else ps = 0 ; mystring ( mystring strcpy( ps , ms.ps ) ; else ps = 0 ; mystring ( ) if ( ps ) delete ps ; /自定义析构函数 mystring if ( ms.ps ) ps = new char strlen( ms.ps ) + 1 ; strcpy( ps , ms.ps ) ; else ps = 0 ; return *this ; void show( ) if ( ps ) cout # include # include template / T为类型参数,代表顺序表中元素的数据类型 class Array T *slist ; /开在堆区的数组容器空间的起始地址 int size ; /堆区数组容器中所能存放元素的最大个数 int last ; /堆区数组容器中已存放元素的个数,空表时 last = 0 public: Array ( int max=10 ) /默认构造函数,初始化顺序表为空表 slist = new T max ; size = max ; last = 0 ; Array ( T *p , int n , int max=10 ) ; /用p指针所指的数组来初始化顺序表 Array ( Array /自定义拷贝构造函数,实现深拷贝 Array ( ) /自定义析构函数,释放堆区的数组容器空间 delete slist ; void inelem ( T x ) ; /将元素 x 加入到顺序表的尾部 28 void print ( ) ; /输出顺序表中各元素 Array slist = new T a.size ; size = a.size ; last = a.last ; for ( int i=0 ; i /用p指针所指的数组来初始化顺序表 Array : Array ( T *p , int n , int max ) while ( n max ) max = 2 * max ; slist = new T max ; size = max ; last = n ; for ( int i=0 ; i /自定义拷贝构造函数,实现深拷贝 Array : Array ( Array size = a.size ; last = a.last ; for ( int i=0 ; i /将元素 x 加入到顺序表的尾部 void Array : inelem ( T x ) if ( last = size ) size = 2 * size ; T *temp = slist ; slist = new T size ; for ( int i=0 ; i /输出顺序表中各元素 void Array : print( ) for ( int i=0 ; i /重载下标“ ”运算符 T cout b ( a ) ; cout c ; cout “新建初始,顺序表c中元素为:n” ; c.print( ) ; c = a ; cout “赋值之后,顺序表c中元素为:n” ; c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论