C++课件6.pptVIP

  1. 1、本文档共18页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C课件6

第六章 动态内存分配  6. 1 堆内存分配 6. 2 链表与链表的基本操作  6. 3 字符串类   6. 1 堆内存分配 C++定义了4种内存区间:代码区,存放程序代码;全局变量与静态变量区,存放全局变量或对象(包括静态);局部变量区即栈(Stack)区,存放局部变量;动态存储区,即堆(Heap)区或自由存储区(FreeStore)。 通常程序中需要的变量、数组、对象等都必须先定义,再使用。各种说明语句让系统直到如何为用户分配所需内存,这称为静态内存分配。 但有很多时候,只有在程序运行期间才可能确定需要什么操作对象,这些操作对象的内存需求系统只能在程序运行时分配,这种情况称为动态内存分配。 系统在内存安排了一个自由存储区即堆,所有动态存储分配都在这个堆区中进行。 6. 1. 1 堆内存的分配与释放 当程序运行到一个需要动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存储该变量或对象。当不再使用该变量或对象时,也就是它的生命期结束时,要显式释放它所占用的存储空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。 指针变量名 = new 类型名(初始化式);   delete 指针名; 对数组进行动态分配和撤销的格式为:  指针变量名 = new 类型名[整型表达式];   delete [ ]指向该数组的指针变量名; 也可以动态申请多位数组: double (*bp)[10]; bp = new double[5][10]; …… delete []bp; 通常使用指针数组的方法动态生成二维数组。 double **p; p = new double*[5]; for(int n = 0; n 5; n++) p[n] = new double[10]; 与前面的结构不同的是,这里的二维数组的各行并不是连续存放的。方括号中的值也可以是表达式。释放时,先释放各行,再释放指针数组。 下面继续讨论动态分配的新问题: (1)动态分配失败。动态创建是在堆区中进行,但是堆区资源有限,动态分配可能失败,尤其在动态创建一个大的数组时。这时new操作符返回一个空指针(NULL),表示发生了异常,堆资源不足,分配失败。 (2)指针删除与堆空间释放。删除一个指针p (delete p)实际含义是删除了p所指的目标(变量或对象等),释放了该目标所占的堆空间,而不是删除p本身,释放堆空间后,p成了空悬指针(指针并未指向一个有效地址,称为空悬指针,空悬指针是程序错误的一个根源)。建议这时将p置空(NULL)。 (3)内存泄漏(Memory Leak)和重复释放。new与delete是配对使用的,delete只能释放堆空间。如果new返回的指针值丢失,则所分配的堆空间将无法回收,这称为内存泄漏。程序执行结束后,这部分内存空间将从系统中丢失,必须重新启动计算机才能找回。 如果对同一空间重复释放也是危险的,因为第一次释放后,再次释放系统会给出警告并终止程序。 6. 1. 2 动态对象与构造函数 Complex *p1,*p2,*p3; p1 = new Complex; //缺省构造函数 p2 = new Complex(5, 13); p3 = new Complex[5]; //动态数组,只能调用缺省构造函数 6. 1. 3 具有动态数据成员的类 例: class ARRAY{ int *p, n; public: ARRAY(int x = 10){ n = x; p = new int[n];} ~ARRAY(){delete []p;} }; void main(){ ARRAY a(5),b(7); a = b; ARRAY c(a); } 这个程序编译没有任何问题,只是执行中会出现系统错误警示框。原因在于这里缺省的赋值运算符重载函数和拷贝构造函数出了预料不及的问题。 在类中具有动态生成数据成员情况下,必须定义自己的赋值运算符重载函数、拷贝构造函数和析构函数。 6. 2 链表与链表的基本操作 6. 3 字符串类 * C++程序设计

文档评论(0)

xcs88858 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档