1 / 45
文档名称:

第七章 动态内存分配.doc

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

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

分享

预览

第七章 动态内存分配.doc

上传人:中国课件站 2011/9/6 文件大小:0 KB

下载得到文件列表

第七章 动态内存分配.doc

文档介绍

文档介绍:动态内存分配
本章首先介绍程序运行时动态内存分配(dynamic memory allocation)的概念与方法。到目前为止,本教材介绍的程序设计中,变量和对象在内存中的分配都是编译器在编译程序时安排好了的,这带来了极大的不便,如数组必须大开小用,指针必须指向一个已经存在的变量或对象。动态内存分配解决了这个问题。本章将进一步讨论拷贝构造函数;还要学习更多有关数据结构的基本知识,包括栈,队,二叉树等的基本算法和应用。模板是标准C++实现代码复用的有力工具,特别是有关数据结构的算法。本章继续使用模板介绍算法。
堆内存分配

C/C++定义了4个内存区间:代码区,存放程序代码;全局变量与静态变量区,存放全局变量或对象(包括静态);局部变量区即栈(stack)区,存放局部变量;动态存储区,即堆(heap)区或自由存储区(free store)。
通常定义变量(或对象),无论是局部变量(对象)或全局变量(对象),也无论它是什么类型,编译器在编译时都可以根据该变量(或对象)的类型知道所需内存空间的大小,从而系统在适当的时候为他们分配确定的存储空间。全局变量在程序开始运行前在全局区分配。局部变量在程序运行到该局部域时在栈区分配,但怎样分配是在编译时就已经确定。尤其是数组,在第六章中介绍的表的基本操作和查找与排序算法,都为数组开了100个元素。如果使用50个,则浪费50个;如果使用150个,则后50个元素就占用了分配给其他变量的内存,造成严重的错误,系统还不知道,编译器也不会报错(不对数组边界做检查),只可能在运行时报“执行非法操作,程序将关闭”。这种内存分配称为静态存储分配(static memory allocation)。
有些操作对象只有在程序运行时才能确定,这样编译器在编译时就无法为他们预定存储空间,只能在程序运行时,系统根据运行时的要求进行内存分配,这种方法称为动态存储分配。系统在内存安排了一个自由存储区(free store)即堆(heap),所有动态存储分配都在这个堆区中进行。

当程序运行到一个需要动态分配的变量或对象时,必须向系统申请取得堆中的一块所需大小的存储空间,用于存储该变量或对象。当不再使用该变量或对象时,也就是它的生命结束时,要显式释放它所占用的存储空间,这样系统就能对该堆空间进行再次分配,做到重复使用有限的资源。
在C++中,申请和释放堆中分配的存储空间,分别使用new和delete的两个运算符来完成,其使用的格式如下:
指针变量名=new 类型名(初始化式);
delete 指针名;
new运算符返回的是一个指向所分配类型变量(对象)的指针。对所创建的变量或对象,都是通过该指针来间接操作的,而
动态创建的对象本身没有名字。一般定义变量和对象时要用标识符命名,称命名对象,而动态的称无名对象(请注意与栈区中的临时对象的区别,两者完全不同:生命期不同,操作方法不同,临时变量对程序员是透明的)。堆区是不会自动在分配时做初始化的(包括清零),所以必须用初始化式(initializer)来显式初始化。new表达式的操作序列如下:从堆区分配对象,然后用括号中的值初始化该对象。从堆区分配对象时,new表达式调用库操作符new()。例如:
int *pi=new int(0);
它与下列代码序列大体等价:
int ival=0;
int *pi=&ival;
只是pi现在所指向的变量是由库操作符new()分配的,位于程序的堆区中,并且该对象未命名。本例给出了怎样为一个指针创建一个对象的过程。当pi生命周期结束时,必须释放pi所指向的目标:
delete pi;
注意这时释放了pi所指的目标的内存空间,也就是撤销了该目标,称动态内存释放(dynamic memory deallocation),但指针pi本身并没有撤销,它自己仍然存在,该指针所占内存空间并未释放。
对于数组进行动态分配和撤销的格式为:
指针变量名=new 类型名[下标表达式];
delete [ ] 指向该数组的指针变量名;
两式中的方括号是非常重要的,两者必须配对使用,如果delete语句中少了方括号,因编译器认为该指针是指向数组第一个元素的指针,会产生回收不彻底的问题(只回收了第一个元素所占空间),加了方括号后就转化为指向数组的指针,回收整个数组。delete [ ]的方括号中不需要填数组元素数,系统自知。即使写了,编译器也忽略。
请注意“下标表达式”不是常量表达式,即它的值不必在编译时确定,可以在运行时确定,请看下例。
【】动态数组的建立与撤销。
#include <>
#include <>
void main

最近更新

2025年福建艺术职业学院单招职业倾向性测试题.. 40页

2026年崇左幼儿师范高等专科学校单招综合素质.. 42页

2025年绍兴职业技术学院单招职业适应性考试模.. 40页

2025年肇庆医学高等专科学校单招职业倾向性测.. 39页

2025年苏州健雄职业技术学院单招综合素质考试.. 41页

2025年苏州工业园区职业技术学院单招综合素质.. 41页

2025年苏州市职业大学单招职业适应性考试模拟.. 38页

2026年广东舞蹈戏剧职业学院单招职业适应性测.. 42页

2025年菏泽职业学院单招综合素质考试题库新版.. 40页

2026年广西单招测试题链接必考题 42页

2025年衡阳科技职业学院单招职业适应性测试模.. 42页

2025年西南交通大学希望学院单招职业倾向性测.. 41页

2025年西安培华学院单招综合素质考试模拟测试.. 41页

2026年庆阳职业技术学院单招职业技能测试题库.. 42页

2025年西安海棠职业学院单招职业倾向性测试模.. 41页

2025年西安职业技术学院单招综合素质考试模拟.. 39页

2025年贵州工业职业技术学院单招职业倾向性测.. 40页

2025年贵州应用技术职业学院单招综合素质考试.. 40页

2026年抚州幼儿师范高等专科学校单招综合素质.. 42页

2026年数字传媒技术单招试题必考题 41页

2025年贵州盛华职业学院单招职业适应性考试模.. 40页

2025年贵州航空职业技术学院单招职业倾向性考.. 41页

2025年贵州食品工程职业学院单招综合素质考试.. 39页

2026年景德镇艺术职业大学单招综合素质考试题.. 42页

2025年赣州职业技术学院单招职业技能测试模拟.. 39页

2026年梧州医学高等专科学校单招综合素质考试.. 40页

2025年辽宁省丹东市单招职业倾向性测试模拟测.. 41页

2025年辽宁省盘锦市单招职业适应性考试模拟测.. 39页

2025年辽宁石化职业技术学院单招职业适应性考.. 39页

2026年江苏省泰州市单招职业倾向性考试模拟测.. 41页