文档详情

C++课件第8章:动态内存分配.pptx

发布:2019-08-29约4.68千字共128页下载文档
文本预览下载声明
第8章 动态内存分配;内容提要;8.1 动态分配内存的概念方法;计算机内存空间分布;示例:内存分配与住宿问题;动态内存分配的方法;动态申请与释放数组空间;动态分配数组空间的注意点一;例:动态数组的分配与撤销;动态分配数组空间的注意点二;动态内存分配的常见雷区;动态内存分配的排雷方案;关于野指针(Wild Pointer);动态二维数组;例:动态二维数组的实现;例:动态二维数组的实现;8.2 对象与动态内存分配;动态分配变量的生存期;概念:三种特殊的对象;三种没有名字的对象;深复制与浅复制; 图7.1 浅复制 ;  当浅复制析构时,如用默认的析构函数,则动态分配的自由存储区对象不能回收。如果在析构函数中有“delete p;”语句,则如果先析构函数obj1时,自由存储区对象已经释放,以后再析构obj2时出现了二次释放的问题。;例:深复制的实现——学生类;例:深复制的实现——学生类;例:深复制的实现——学生类;例:深复制的实现——学生类;例:深复制的实现——学生类;深复制与类封装的深入讨论;8.3 标准C++库中的string类;标准C++库中的string类;标准C++库中的string类;标准C++库中的string类;标准C++库中的string类;标准C++库中的string类;标准C++库中的string类;关于string类的思考和猜想;第一个版本:自定义string类;mystring类的实现;mystring类的实现;mystring类的实现;mystring类的实现;mystring类的后续; 线性表是最简单,最常用的一种数据结构。线性表的逻辑结构是n个数据元素的有限序列(a1,a2,…,an)。而线性表的物理结构包括:顺序表,链表 。;单链表的基本构成;链表节点的C风格实现;关于typedef(P173);链表的操作要点;第一个结点通常称为头节点,其对应的指针head称为头指针。head在使用中不可丢失,否则整个链表都会发生内存泄漏。 最后一个节点,通常称为尾节点tail,其地址域的值为NULL,表示链表到此结束。;链表的基本操作;链表的插入算法;;;; 研究以上算法,插在链表第一个结点之前与其他结点之前的算法有所不同。要使算法中没有特殊者,可以给每一个链表加上一个表头结点。;;;思考:更多的链表生成方式;链表查找算法(按关键字)查找;链表插入算法;思考:更多的链表插入函数;void del (node *p){ node *q; q=p-link; p-link=q-link; delete q; //如果要把该节点移入另一个链中,则可将q返回。 } 思考:仿造插入算法,思考更多的删除方式。;思考与练习;data;data;a;更多链表的实现内容(*);C风格链表实现的不足;单链表类型模板;单链表节点类;单链表节点类实现;单链表节点类实现;单链表类型模板;单链表类型模板;单链表模板类函数;templatetypename Tvoid ListT::MakeEmpty(){//清空链表 NodeT *tempP; while(head-link!=NULL){ tempP=head-link; head-link=tempP-link; //把头结点后的第一个结点从链中脱离 delete tempP; } //删除(释放)脱离下来的结点 tail=head; } //表头指针与表尾指针均指向表头结点,表示空链;templatetypename T NodeT* ListT::Find(T data){ NodeT *tempP=head-link; while(tempP!=NULLtempP-info!=data) tempP=tempP-link; return tempP; //搜索成功返回地址,不成功返回NULL } ;templatetypename Tint ListT::Length(){ //链表长度 NodeT* tempP=head-link; int count=0; while(tempP!=NULL){ tempP=tempP-link;count++;} return count; } ;templatetypename Tvoid ListT::InsertFront(NodeT *p){ p-link=head-link; head-link=p; if(tail==head) tail=p;} templatetypename Tvoid ListT::InsertRear(NodeT *p){ p-link
显示全部
相似文档