专题五 - 内存管理的艺术.pdf
《专题五 - 内存管理的艺术.pdf》由会员分享,可在线阅读,更多相关《专题五 - 内存管理的艺术.pdf(39页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、版权声明版权声明版权声明版权声明:本课件及其印刷物本课件及其印刷物本课件及其印刷物本课件及其印刷物、视频的版权归成都国嵌信息技术有限公司所有视频的版权归成都国嵌信息技术有限公司所有视频的版权归成都国嵌信息技术有限公司所有视频的版权归成都国嵌信息技术有限公司所有,并保留所有权力并保留所有权力并保留所有权力并保留所有权力:任何单任何单任何单任何单位或个人未经成都国嵌信息技术有限公司书面授权位或个人未经成都国嵌信息技术有限公司书面授权位或个人未经成都国嵌信息技术有限公司书面授权位或个人未经成都国嵌信息技术有限公司书面授权,不得使用该课件及其印刷物不得使用该课件及其印刷物不得使用该课件及其印刷物不得使
2、用该课件及其印刷物、视频从事商业视频从事商业视频从事商业视频从事商业、教学活教学活教学活教学活动动动动。已经取得书面授权的已经取得书面授权的已经取得书面授权的已经取得书面授权的,应在授权范围内使用应在授权范围内使用应在授权范围内使用应在授权范围内使用,并注明并注明并注明并注明“来源来源来源来源:国嵌国嵌国嵌国嵌”。违反上述声明者违反上述声明者违反上述声明者违反上述声明者,我们将追究其我们将追究其我们将追究其我们将追究其法律责任法律责任法律责任法律责任。专题五专题五专题五专题五内存管理的艺术内存管理的艺术内存管理的艺术内存管理的艺术嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨
3、询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116Contents动态内存分配动态内存分配动态内存分配动态内存分配程序中的三国天下程序中的三国天下程序中的三国天下程序中的三国天下程序的内存布局程序的内存布局程序的内存布局程序的内存布局头疼的野指针头疼的野指针头疼的野指针头疼的野指针嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116Contents经典错误经典错误经典
4、错误经典错误,你犯了吗你犯了吗你犯了吗你犯了吗交通规则交通规则交通规则交通规则,还是应该遵守还是应该遵守还是应该遵守还是应该遵守嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116Contents动态内存分配动态内存分配动态内存分配动态内存分配程序中的三国天下程序中的三国天下程序中的三国天下程序中的三国天下程序的内存布局程序的内存布局程序的内存布局程序的内存布局头疼的野指针头疼的野指针头疼的野指针头疼的野指针嵌入式嵌入式嵌入式嵌入式Linux技术咨询
5、技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116为什么使用动态内存分配为什么使用动态内存分配为什么使用动态内存分配为什么使用动态内存分配? C C C C语言中的一切操作都是基于内存的语言中的一切操作都是基于内存的语言中的一切操作都是基于内存的语言中的一切操作都是基于内存的? 变量和数组都是内存的别名变量和数组都是内存的别名变量和数组都是内存的别名变量和数组都是内存的别名,如何分配这些内存由编如何分配这些内存由编如何分配这些内存由编如何分配这些内存由编译器在编译期间决定译器在编译期间决定
6、译器在编译期间决定译器在编译期间决定? 定义数组的时候必须指定数组长度定义数组的时候必须指定数组长度定义数组的时候必须指定数组长度定义数组的时候必须指定数组长度? 而数组长度是在编译期就必须决定的而数组长度是在编译期就必须决定的而数组长度是在编译期就必须决定的而数组长度是在编译期就必须决定的需求需求需求需求:程序运行的过程中程序运行的过程中程序运行的过程中程序运行的过程中,可能需要使用一些额外的内存空间可能需要使用一些额外的内存空间可能需要使用一些额外的内存空间可能需要使用一些额外的内存空间。example1-嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 5
7、50491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116malloc和和和和free? malloc和和和和free用于执行动态内存分配和释放用于执行动态内存分配和释放用于执行动态内存分配和释放用于执行动态内存分配和释放内存池内存池内存池内存池程序程序程序程序mallocfree申请申请申请申请归还归还归还归还嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116malloc和和和和free?
8、malloc所分配的是一块连续的内存所分配的是一块连续的内存所分配的是一块连续的内存所分配的是一块连续的内存,以字节为单位以字节为单位以字节为单位以字节为单位,并且不带任何的类型信息并且不带任何的类型信息并且不带任何的类型信息并且不带任何的类型信息? free用于将动态内存归还系统用于将动态内存归还系统用于将动态内存归还系统用于将动态内存归还系统void* malloc(size_t size);void free(void* pointer);注意注意注意注意:malloc实际分配的内存可能会比请求的稍微多一点实际分配的内存可能会比请求的稍微多一点实际分配的内存可能会比请求的稍微多一点实际分
9、配的内存可能会比请求的稍微多一点,但是不但是不但是不但是不能依赖于编译器的这个行为能依赖于编译器的这个行为能依赖于编译器的这个行为能依赖于编译器的这个行为当请求的动态内存无法满足时当请求的动态内存无法满足时当请求的动态内存无法满足时当请求的动态内存无法满足时malloc返回返回返回返回NULL当当当当free的参数为的参数为的参数为的参数为NULL时时时时,函数直接返回函数直接返回函数直接返回函数直接返回嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212
10、116calloc和和和和realloc?你认识你认识你认识你认识malloc的兄弟吗的兄弟吗的兄弟吗的兄弟吗?void* calloc(size_t num, size_t size);void* realloc(void* pointer, size_t new_size);? calloc的参数代表所返回内存的类型信息的参数代表所返回内存的类型信息的参数代表所返回内存的类型信息的参数代表所返回内存的类型信息? calloc会将返回的内存初始化为会将返回的内存初始化为会将返回的内存初始化为会将返回的内存初始化为0 0 0 0? realloc用于修改一个原先已经分配的内存块大小用于修改一个
11、原先已经分配的内存块大小用于修改一个原先已经分配的内存块大小用于修改一个原先已经分配的内存块大小? 在使用在使用在使用在使用realloc之后应该使用其返回值之后应该使用其返回值之后应该使用其返回值之后应该使用其返回值? 当当当当pointer的第一个参数为的第一个参数为的第一个参数为的第一个参数为NULL时时时时,等价于等价于等价于等价于嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116calloc和和和和realloc的使用的使用的使用的使用实
12、例分析实例分析实例分析实例分析1-嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116小结小结小结小结? 动态内存分配是动态内存分配是动态内存分配是动态内存分配是C C C C语言中的强大功能语言中的强大功能语言中的强大功能语言中的强大功能? 程序能够在需要的时候有机会使用更多的内存程序能够在需要的时候有机会使用更多的内存程序能够在需要的时候有机会使用更多的内存程序能够在需要的时候有机会使用更多的内存? malloc单纯的从系统中申请固定字节大小的内
13、存单纯的从系统中申请固定字节大小的内存单纯的从系统中申请固定字节大小的内存单纯的从系统中申请固定字节大小的内存? calloc能以类型大小为单位申请内存并初始化为能以类型大小为单位申请内存并初始化为能以类型大小为单位申请内存并初始化为能以类型大小为单位申请内存并初始化为0 0 0 0? realloc用于重置内存大小用于重置内存大小用于重置内存大小用于重置内存大小嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116问题问题问题问题malloc(0);
14、将返回什么将返回什么将返回什么将返回什么?嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116Contents动态内存分配动态内存分配动态内存分配动态内存分配程序中的三国天下程序中的三国天下程序中的三国天下程序中的三国天下程序的内存布局程序的内存布局程序的内存布局程序的内存布局头疼的野指针头疼的野指针头疼的野指针头疼的野指针嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Li
15、nux学习交流学习交流学习交流学习交流QQ群群群群: 65212116程序中的栈程序中的栈程序中的栈程序中的栈? 栈是现代计算机程序里最为重要的概念之一栈是现代计算机程序里最为重要的概念之一栈是现代计算机程序里最为重要的概念之一栈是现代计算机程序里最为重要的概念之一? 栈在程序中用于维护函数调用上下文栈在程序中用于维护函数调用上下文栈在程序中用于维护函数调用上下文栈在程序中用于维护函数调用上下文,没有栈就没有没有栈就没有没有栈就没有没有栈就没有函数函数函数函数,没有局部变量没有局部变量没有局部变量没有局部变量嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 55
16、0491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116程序中的栈程序中的栈程序中的栈程序中的栈? 栈保存了一个函数调用所需的维护信息栈保存了一个函数调用所需的维护信息栈保存了一个函数调用所需的维护信息栈保存了一个函数调用所需的维护信息? 函数参数函数参数函数参数函数参数,函数返回地址函数返回地址函数返回地址函数返回地址? 局部变量局部变量局部变量局部变量? 函数调用上下文函数调用上下文函数调用上下文函数调用上下文嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式L
17、inux学习交流学习交流学习交流学习交流QQ群群群群: 65212116程序中的堆程序中的堆程序中的堆程序中的堆? 为什么有了栈还需要堆为什么有了栈还需要堆为什么有了栈还需要堆为什么有了栈还需要堆?? 栈上的数据在函数返回后就会被释放掉栈上的数据在函数返回后就会被释放掉栈上的数据在函数返回后就会被释放掉栈上的数据在函数返回后就会被释放掉,无法传递到函数外无法传递到函数外无法传递到函数外无法传递到函数外部部部部,如如如如:局部数组局部数组局部数组局部数组? 堆是程序中一块巨大的内存空间堆是程序中一块巨大的内存空间堆是程序中一块巨大的内存空间堆是程序中一块巨大的内存空间,可由程序自由使用可由程序自
18、由使用可由程序自由使用可由程序自由使用? 堆中被程序申请使用的内存在程序主动释放前将一直堆中被程序申请使用的内存在程序主动释放前将一直堆中被程序申请使用的内存在程序主动释放前将一直堆中被程序申请使用的内存在程序主动释放前将一直有效有效有效有效堆空间通过申请才能堆空间通过申请才能堆空间通过申请才能堆空间通过申请才能获得获得获得获得!嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 65212116程序中的堆程序中的堆程序中的堆程序中的堆? 系统对堆空间的管理方式系统
19、对堆空间的管理方式系统对堆空间的管理方式系统对堆空间的管理方式? 空闲链表法空闲链表法空闲链表法空闲链表法,位图法位图法位图法位图法,对象池法等等对象池法等等对象池法等等对象池法等等12 Bytes5 Bytes50 Bytes100 Bytes空闲链空闲链空闲链空闲链表指针表指针表指针表指针NULLNULLNULLNULL空闲链表管理法示意图空闲链表管理法示意图空闲链表管理法示意图空闲链表管理法示意图嵌入式嵌入式嵌入式嵌入式Linux技术咨询技术咨询技术咨询技术咨询QQ号号号号: 550491596嵌入式嵌入式嵌入式嵌入式Linux学习交流学习交流学习交流学习交流QQ群群群群: 652121
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 专题五 内存管理的艺术 专题 内存 管理 艺术
限制150内