C++动态内存创建与内存管理学习笔记-Read.DOCVIP

C++动态内存创建与内存管理学习笔记-Read.DOC

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
C动态内存创建与内存管理学习笔记-Read

HYPERLINK /SuperXu_swjtu/archive/2006/10/21/1343791.aspx C++动态内存创建与内存管理学习笔记 1 内存空间逻辑组织 A 静态数据区:内存在程序启动的时候才被分配,而且可能直到程序开始执行的时候才被初始化,如函数中的静态变量就是在程序第一次执行到定义该变量的代码时才被初始化。所分配的内存在程序的整个运行期间都存在,如全局变量,static变量等。 注意:初始化的全局变量和静态变量在一块区域,未初始化的全局变量与静态变量在相邻的另一块区域,同时未被初始化的对象存储区可以通过void*来访问和操纵,程序结束后由系统自行释放。 B 代码区:存放函数体的二进制代码; C 栈区:存放自动变量。在执行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元由编译器自动释放,超出其作用域外的操作没有定义。栈内存分配运算内置于处理器的指令集中,效率很高,但分配的内存容量有限。栈存放函数的参数值,局部变量的值等。 D 堆区(自由存储区):在运行的时候调用程序(如C中的malloc或C++中的new)分配内存,可以在任何时候决定分配内存及分配的大小,用户自己负责在何时释放内存(如用free或delete)。堆中的所有东西都是匿名的,这样不能按名字访问,而只能通过指针访问。 堆需要一种策略来保存其内存是否已分配的信息。一种策略是建立一个可用块(自由存储区)的链表,每块由malloc分配的内存块都在自己的前面标明自己的大小,一般而言都经过边界对齐(alignment)处理,堆的大小受限于计算机系统中有效的虚拟内存。 堆的末端由一个称为break 的指针来标识,当堆管理器需要更多内存时,它可以通过系统调用brk和sbrk来移动break指针,一般情况下不必显式地调用brk,如果分配的内存容量很大,brk会被自动调用。用于管理内存的调用有: Malloc和free--从堆中获得内存以及把内存返回给堆; brk与sbrk――调整数据段的大小至一个绝对值(通过某个增量)。 注意:程序可能无法同时调用malloc()与brk(),因为如果使用了malloc,malloc希望当你调用brk与sbrk时,它具有唯一的控制权。由于sbrk向进程提供了唯一的方法将数据段内存返回给系统内核,所以如果使用了malloc,就有效地防止了程序的数据段缩小的可能性。 此处的堆与数据结构中的堆是两回事,它的分配方式类似于链表。 由于堆中的空间由用户负责分配及释放,因此需要注意内存泄漏的问题。 另外实际上堆区与自由存储区并不是一回事,详细信息见exceptional c++条款35。 E 文字常量区(常量数据区):存放常量字符串等在编译期间就能确定的值,在程序结束后由系统自动释放。类对象不能存在于这个区域中。在本区域中所有的数据都是只读的,任何企图修改本区域数据的行为都会造成无法预料的后果。 演示内存分布的示例如下:(示例需要更改完善,同时解决其中的bug) int a = 0; //全局初始化区 char *p1; //全局未初始化区 main() { int b; //栈 char s[] = abc; //栈 char *p2; //栈 char *p3 = 123456; //123456在文字常量区,p3在栈上。(如何得到文字常量地址?) static int c =0; //全局(静态)数据区 p1 = (char *)malloc(10); p2 = (char *)malloc(20); //分配得来的10和20字节的区域就在堆区。(如何得到?) strcpy(p1, 123456); //123456放在常量区,编译器可能会将它与p3所指向的123456优化成一个地方。 } ? 2 C中内存分配 A malloc:原型为void* malloc(size_t size);在内存中的动态存储区中分配一个长度为size的空间,返回指向大小为size的内存区域首地址的void指针;用户必须决定对象的长度,即申请空间的大小。同时,malloc只是分配了一块返回值为void*的内存而不是生成一个对象。由于malloc返回值的类型是void*,所以在调用malloc时要显式地进行类型转换,将void* 转换成所需要的指针类型,malloc函数本身并不识别要申请的内存是什么类型,它只关心内存的总字节数,因此使用sizeof是很好的方式,例如:int* p = (int*) malloc(sizeof(int) * length);使用malloc所分配的是一块连续的内存,同时由于编译器的实现问题(比如边界对齐等),其所分配的内存可能比所请求的多一点。 如果内存池

文档评论(0)

zhaoxiaoj + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档