第八章 C++高级主题.ppt

  1. 1、本文档共40页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
主讲教师: 陈良银 个人主页: 教材:《C++面向对象程序设计》 李涛 主编 游洪跃 陈良银 李琳等编 高等教育出版社 2006年2月出版 本书内容 第1章 C++基础知识 第2章 C++类和对象 第3章 继承 第4章 多态性 第5章 模板 第6章 标准模板库 第7章 C++输入和输出 第8章 C++高级主题 第9章 MFC开发 实验 (待安排) 8.1 动态内存管理 8.1.1 new运算符和delete运算符的作用 new运算符作用 使用new运算符将根据用户自定义类型或系统定义类型自动执行对应的构造函数,申请分配相应大小的动态空间。 new运算符的基本使用格式: <指针名> = new <类型> (<实参表>); new不但能自动计算所要分配的内存空间大小,还能返回正确的指针类型。 当系统无法满足内存分配的请求时,将返回NULL,所以执行new后必须判断指针是否为NULL,如果返回是则表示分配内存不成功。 new示例: int *p1,*p2,(*p3)[3]; p1 = new int; p2 = new int(200); p3 = new int [2][3]; CNode * poCN1 = new CNode[LEN]; CNode *poCN2 = new CNode(5); CNode * poCN1 = new CNode[LEN]; new生成一个对象数组时不能带参数,即生成对象数组时只能调用无参构造函数或者全部参数都有默认值的构造函数。 有两种方法对对象数组中元素初始化: (1) 不定义构造函数,而在类中定义一个成员函数完成初始化。 (2)在类中定义不带参数或带默认参数的构造函数。 执行CNode *poCN2 = CNode(5);语句时,会在内存生成一个对象指针变量和一个在动态内存空间中的对象。这个指针变量指向动态内存空间对象的首地址。 动态内存空间对象没有名字,只有通过这个指针变量才能访问它。 在该对象未被销毁前不能随便更改指针变量的值,否则没办法找到该对象,将造成内存泄漏。 delete运算符的作用 delete运算符的基本使用格式: delete <指针名>; //释放一般对象或者变量 delete []<指针名>; //释放整个数组 delete用来释放用new所申请分配的动态内存空间。 <指针名>中存放即将释放的动态内存空间的首地址。大小由指针所指向对象类型决定。 当释放new所创建的数组时,使用delete []<指针名>形式即可。 delete运算符示例: delete p1; delete p2; delete []p3; delete []poCN1; delete poCN2; 注意:delete只能用来释放new申请分配的动态内存空间,反之,new申请的动态空间必须用delete来释放。new和delete必须有对应关系。 delete执行后,指针所指向的内存空间就被释放了,而指向该动态内存区域的指针变量本身并不会因为delete有所改变。 被释放的动态内存空间随时有可能被分配给别的任何变量,所以此后通过指针变量对该动态内存的任何操作都可能引起系统崩溃。 用if(p!=NULL)防止不了这种错误,delete以后,需要把NULL赋值给指针变量,不指向任何动态内存空间。 delete以后不对指针变量做任何处理,可能造成“指针悬挂”;没初始化就通过指针变量操作内存,则有可能造成一个“野指针”。从以下几点预防: 定义指针变量的同时初始化。 delete指针后,第一时间赋值NULL。 避免用指针传递栈内存,避免返回一个即将自动消失的局部变量或者局部对象的地址。 注意区分指针变量和指针指向的内存空间的差异。 例8_1 s8_1\smain8_1.cpp 在例中,调用new生成了对象数组和一般数据类型int的数组。如将CNode(int value =0)声明中的“=0”去掉,程序编译将报错。因为类CNode的构造函数没有无参构造函数或者全部带默认值的构造函数。 8.1.2重载 new 和 delete运算符 当系统提供的 new 和delete 不能满足用户的特殊要求时,可以重载new 和 delete运算符。 new 和 delete 可以在类内重载,也可以在类外重载。类外重载就是全局重载,这会覆盖系统自定义的new 和 delete功能,所以一般不采用。 在类内,new 和 delete只能重载为成员函数,并且无论是否使用关键字static修饰,都是类的静态成员函数。 运算符 new 重载的一般形式为: void *operator new(size_t,<arg_list>); new应返回一个

文档评论(0)

文人教参 + 关注
实名认证
内容提供者

老师教学,学生学习备考课程、成人语言培训课程及教材等为提升学生终身学习竞争力,塑造学生综合能力素质,赋能学生而努力

版权声明书
用户编号:6103150140000005

1亿VIP精品文档

相关文档