C++课件第8章:动态内存分配.pptx
文本预览下载声明
第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
显示全部