版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第5章动态内存分配,153360293:07,2/51,默认数据类型的初始化单个对象内存的动态分配和释放对象数组内存的动态分配和释放使用new和delete在可用存储上动态分配和释放字符串多维数组内存,15336029:07,3/51动态内存分配:在程序运行时调用和分配运行时库函数静态和动态内存分配之间的三个茄子主要区别:静态对象是有名称的变量,直接操纵。动态对象是没有名称的变量,通过指针间接操作。静态对象的分配和取消分配将编译器自动处理。程序员应该理解这个,但什么都不用做。另一方面,动态对象分配和释放需要由程序员显示管理,在错误、内存分配、153360293:07,4/51、内存分配:静态和
2、动态、效率和灵活性之间的平衡指导是不同的。静态内存分配是在程序运行之前执行的,因此效率很高,但灵活性不足,需要知道程序运行之前所需的内存类型和数量。例如,使用静态分配的字符串数组不能轻松地处理和保存任何文本文件。未知的元素存储通常需要动态内存分配灵活性。内存分配、15336029336007、5/51、概述、C语言的动态内存分配和释放、使用malloc()和free()函数。c语言中的malloc()和free()函数用法不再用于c中的动态内存分配和释放。因为:malloc()函数在运行时从自由内存分配存储设备。在c中创建对象(1)时,会发生两次为对象分配内存的茄子。(2)调用配置函数以初始化
3、该内存。配置函数无法传递内存地址以进行初始化。在c中,使用new和delete动态分配和释放内存。New触发类对象的配置函数delete。类对象的分析函数、动态内存分配、15336029336007、6/51、5个内存区域、c中的内存分为5个区域:堆栈、堆栈、自由存储、全局/。堆栈。按需分配编译器,不需要时自动清除的变量的存储库。内部变量通常是局部变量、函数参数等。积累。新分配的内存块。不是他们的发布、编译器、管,而是由我们的应用程序控制的,通常new应该对应delete。如果程序员时未释放分配的内存,节目关闭后自动回收操作系统。但是如果节目没有结束,就有内存泄漏。自由存储区域。Malloc等
4、分配的内存块,与堆非常相似,但使用free结束自己的生命(释放内存)。全局/静态存储库。全局变量和静态变量分配给同一内存。在以前的C语言中,全局变量()分为已初始化和未初始化,C中没有这种区分,它们共同占用相同的内存区域。常量存储。这是一个比较特殊的存储库,其中存放着常数,一般不允许修改(当然,可以通过不正当的手段修改)。15336029:07,7/51,动态请求内存运算符new,语法格式:类型名称T *指针变量名称P=new类型名称T(初始值列表);功能:在节目运行过程中,请求保留T型对象的连续未命名内存空间,并根据初始值列表指定初始值。结果值:成功:指向新分配内存的t型指针。失败:0(NU
5、LL) new运算符是一元运算符。隐式创建函数函数operator new(),返回指向已分配内存对象的指针。动态内存分配,15336029336007,8/51,取消删除内存运算符,语法格式:删除指针变量名p;删除指针变量名p;功能:释放指针p指向的内存。p必须是new操作的返回值。Delete表达式首先调用解析函数,它是否内存(经常调用free()。如果正在删除的指针为零,则什么都不会发生,并且是安全的。因此,开发人员通常在删除指针后立即将指针指定为0,以避免删除两次(删除一个对象两次可能会出现问题)。使用、15:29:07,9/51、delete void*时可能会出错。如果要对void
6、*类型指针执行delete操作,则可能是程序错误,因为指针指向的内容未执行。初始化Void*指针时,指向元数据(而不是指向解析函数包含对象),调用删除时删除void*指针不会出错。需要的是只释放指针本身(对象)的牙齿内存。但是,这将只释放对象的内存,不执行解析函数调用,因此不会释放指针所指向的数据的内存,从而导致内存泄漏问题。编译这些程序时,编译器们认为他们知道我们在做什么,所以编译器们不会给出任何警告。因此,必须将void指针转换为相应的类型。15336029:07,10/51,如何将动态内存分配给单个对象,语法格式:数据类型T *指针变量名称P=new数据类型T(初始化列表);例如:int
7、 * ptrInt=new int/one intdouble * ptr double=new double;/one double float * * ptrptrfloat=new float *;/One pointer-to-float不同类型占用的徐璐其他空间由编译器自动化处理。动态内存分配,15336029:07,11/51,如何将动态内存分配给单个对象,默认new在将地址传递给配置函数之前将检查内存分配是否成功,因此无需直观地确认调用是否成功。如果调用New在可用空间中找不到所需的内存,则会抛出std:bad_alloc类型的异常。您可以在关键字后写入表达式(std:nothr
8、ow),以便operator new()在存储溢出发生时返回0(空指针)。这样就不会再发生异常。使用c关键字new,然后沿类型为可用存储分配此类型的单个对象的内存空间,并获取指向上次分配的内存实例的指针。动态内存分配,15336029:07,12/51,如何初始化基本类型,C中的关键点是遵循PITA规则。也就是说,在创建对象时,不是先创建对象,然后指定值,而是初始化对象。您可以随时初始化可用存储分配的单个对象。初始化方法:通过在特定类型后使用括号中的初始化值来完成。New数据类型初始化列表(t);动态内存分配,15:29:07,13/51,例如int * ptrInt=new int(100)
9、;double * ptr double=new double(1.414);float * ptr float=new float(3.1415926 f);float * * ptrptrfloat=new float *(ptr float);动态内存分配、基本类型初始化方法、15336029:07,14/51、空括号的含义、new表达式可以在类型名称后使用空括号。new数据类型t();功能:初始化为数据类型t的默认值。动态内存分配,15:29:07,15/51,new数据类型t;和new数据类型t();的差异,例如int * ptrInt1=new int/value is unkno
10、wn int * pt rint 1=new int;/Value is zero说明:首先,在可用存储上创建了int类型的对象,但其值未知。第二种情况下,将在可用存储上创建int类型的对象,并使用全局变量区域int中的值(默认值)初始化该对象。对于所有全局基本类型,默认情况下初始值为0,因此在第二种情况下,创建对象后将其值初始化为0。动态内存分配,15336029336007,16/51,如何释放单个对象的可用空间,语法格式:删除指针变量名p;指针变量名P=NULL功能:释放指针p指向的内存。p必须是new操作的返回值。删除基于零的指针(空指针)始终是安全的操作。,动态内存分配,153360
11、29336007,17/51,如何为对象数组分配空闲空间,语法格式:数据类型T *指针变量名P=new数据类型T元素数;功能:将物件阵列指定给可用空间。指针p指向数组中的第一个元素点。方括号中的表达式的值为0(零)将指定不带元素的数组。new表达式返回的指针不是零牙齿,与指向对象的其他指针不同。如果在运行过程中确定牙齿值无效,则结果无法预测。动态内存分配,15336029:07,18/51,如何为对象数组分配空闲空间(例如/array of 5 ints int * ptr int=new int 5;/array of 6 doubles int dimension=6;double * p
12、tr double=new double dimension;动态内存分配,15336029:07,19/51,无法初始化为对象数组分配可用空间的方法数组。c没有用于初始化可用存储库中各个元素的语法(不遵循PITA规则)。对于所有基础数据类型,每个元素值未知。创建数组后,可以按如下方式指定每个元素的值:int const dimension=5;/allocate space for 5 ints,all uninitialized int * ptr int=new int dimension;/provide some meaning ful values for(int I=0;I维;I
13、)ptrInti=I;说明:可以在可用存储中初始化用户定义的数据类型的数组。动态内存分配,15336029336007,20/51,如何释放对象数组的空闲空间,语法格式:删除指针变量名p;功能:从可用存储中释放对象阵列内存空间。说明:应使用方括号“”通知编译器这是对象数组。牙齿代码的任务是在创建数组时回收存储在某个地方的对象数,并调用数组中所有对象的解析函数。删除用户定义数据类型的数组时,这一点很重要。与放置单个对象一样,对包含零值的指针使用delete被认为是安全的。动态内存分配、15336029336007、21/51、保持平衡、new和delete的主要规则很简单。使用delete平衡每
14、个new。如果在New语句中使用方括号(即分配了对象数组),则必须在delete之后使用方括号。每次使用New时,必须使用正确的delete格式。使用、动态内存分配、15336029336007、22/51、new和delete将字符串存储在可用存储上,使用指针数组跟踪每个字符串的方法数组存储在可用存储上,并根据字符输入自动增加。您可以使用typedef,以避免到处使用星号(简化语法)。“string # 1”、“string # 2”、“string # 3”、“string # n”、elem.0、elem.2、“例如int const cols=5;double(* ptr)cols=n
15、ew doubler owscols;/delete ptr;动态内存分配、15336029336007、24/51、如何分配和删除多维数组;例如,二维数组的元素是一维数组的集合(行)。因此,要创建指向一维数组的指针,需要包含*ptr牙齿的括号。Ptr 1表示第二个一维数组的开始(第一行,0列),而不是第二个双精度元素(第0行,第一列)。使用New在可用存储中为数组分配空间时,除第一个维之外的所有维都必须通知编译器,并且必须为正数。这就是为什么rows可以在运行时确定,cols必须是常量。15:29:07,25/51,如何分配和删除多维数组,删除数组时,delete语句的格式与一维数组的格式相
16、同。也就是说,不需要指定列数。使用Typedef可以简化语法。例如:int rows=3;int const cols=5;Typedef double ONE _ DIMcolsONE _ DIM * ptr=new ONE _ DIMrows/delete ptr;使用、15336029:07,26/51、空间命名、new在可用存储库中为对象分配空间时,获取指向对象的指针,然后取消引用牙齿指针以访问对象。但是,您也可以不使用取消引用指针访问可用存储库中的对象。为此,可以取消引用new返回的地址并创建别名。然后,可以使用牙齿别名简单地引用牙齿对象。但是,由于delete需要分配的可用存储库的地址,因此必须小心使用地址获取运算符/release the space、15:293:07、27/51、两个节目输出示例、intmain () int、Int *,执行结果:1 1 1,执行结果:1 2,15336029:07,28/51,范例1动态建立物件范例,using namespace STDclass point publi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 医疗机构多学科会诊制度及流程
- 介入治疗技术试题及答案
- 医疗器械企业成本核算制度(试行)
- 气瓶充装运输安全管理制度培训
- 安全环境职业健康目标管理制度培训课件
- 2026年数字孪生城市规划服务合同
- 2026年国际交换生项目合同
- 学校安全管理职责培训:分管领导与部门负责人工作实务
- 2026年315消费者权益日答题题目及答案
- 2026年智慧城市平台开发合同
- 【2026春】部编版八年级下册语文读读写写(注音+解释)
- 第二单元+新音乐启蒙+课件【高效课堂精研】高中音乐粤教花城版必修音乐鉴赏
- 上海2025年上海交通大学医学院招聘72人笔试历年参考题库附带答案详解
- 全国美容院质量与服务调查报告(2023-2024)
- 部编2023版道德与法治六年级下册活动园问题及答案
- 离职证明模板电子版
- GB/T 4308-1984金属陶瓷热挤压模坯
- GB/T 38603-2020燃气燃烧器和燃烧器具用安全和控制装置特殊要求电子控制器
- GB/T 18983-2017淬火-回火弹簧钢丝
- 高效课堂学习小组建设课件
- (新版)中国移动认证L1、L2、L3等级考试总题库-单选题库(共12部分-2)
评论
0/150
提交评论