1 / 85
文档名称:

堆内存分配.ppt

格式:ppt   页数:85页
下载后只包含 1 个 PPT 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

堆内存分配.ppt

上传人:chuandao1680 2016/5/3 文件大小:0 KB

下载得到文件列表

堆内存分配.ppt

文档介绍

文档介绍:堆内存分配 MFC 对象和 Windows 对象的关系 二叉树 栈与队列的基本操作及其应用 链表与链表的基本操作第七章动态内存分配 堆内存分配 堆内存的分配与释放 堆对象与构造函数 浅拷贝与深拷贝 堆内存的分配与释放 当程序运行到需要一个动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存贮空间,用于存贮该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存贮空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。 在 C++ 中,申请和释放堆中分配的存贮空间,分别使用 new 和 delete 的两个运算符来完成,其使用的格式如下: 指针变量名=new 类型名(初始化式); delete 指针名; new 运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而动态创建的对象本身没有名字。 堆内存的分配与释放 ( initializer )来显式初始化例如: int * pi=new int(0); pi生命周期结束时,必须释放 pi所指向的目标: delete pi; 注意这时释放了 pi所指的目标的内存空间,也就是撤销了该目标, 称动态内存释放( dynamic memory deallocation ), 但指针 pi 本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放。堆0 Pi ( initializer )来显式初始化例如: int * pi=new int(0); pi生命周期结束时,必须释放 pi所指向的目标: delete pi; 注意这时释放了 pi所指的目标的内存空间,也就是撤销了该目标, 称动态内存释放( dynamic memory deallocation ), 但指针 pi 本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放。 堆内存的分配与释放堆 Pi 堆内存的分配与释放 对于数组进行动态分配的格式为: 指针变量名=new 类型名[下标表达式]; delete [ ] 指向该数组的指针变量名; 堆内存的分配与释放【例 】动态数组的建立与撤销#include <> #include <> void main(){ int n; char * pc; cout <<" 请输入动态数组的元素个数"<< endl ; cin >>n; pc=new char[n]; // strcpy(pc ,"堆内存的动态分配"); cout <<pc<< endl ; delete []pc; // 撤销并释放 pc 所指向的 n个字符的内存空间 return ; } 堆内存的分配与释放 动态分配的三个特点:首先,变量 n在编译时没有确定的值,而是在运行中输入,按运行时所需分配堆空间,这一点是动态分配的优点,可克服数组“大开小用”的弊端,在第六章中表,排序与查找中的算法,若用动态数组,通用性更佳。 delete []pc 是将 n个字符的空间释放,而用 delete pc 则只释放了一个字符的空间;其次如果有一个 char * pc1 ,令 pc1=p ,同样可用 delete [] pc1 来释放该空间。尽管 C++ 不对数组作边界检查, 但在堆空间分配时,对数组分配空间大小是纪录在案的。第三,没有初始化式( initializer ), 不可对数组初始化。 堆内存的分配与释放指针使用的几个问题: 。返回一个空指针( NULL ), 表示 发生了异常,堆资源不足,分配失败。 。删除一个指针 p( delete p; ) 实际意思是删除了 p所指的目标(变量或对象等),释 放了它所占的堆空间,而不是删除p本身,释放堆空 间后,p成了空悬指针 堆内存的分配与释放 3. 内存泄漏( memory leak )和重复释放。 new 与 delete 是配对使用的, delete 只能释放堆空间。 如果 new 返回的指针值丢失,则所分配的堆空间无 法回收,称内存泄漏,同一空间重复释放也是危险 的,所以必须妥善保存 new 返回的指针,以保证不 发生内存泄漏,也必须保证不会重复释放堆内存空 间。 。无名对象,它的 生命期并不依赖于建立它的作用域,比如在函数中 建立