修改堆内存_内存结构重新学c. 堆

概述

c语言中,堆区可以自由被开发者掌控。高度的自由也需要带来高额的管理成本,如申请后需要手动释放,本文是笔者学习堆区的笔记。

malloc和free

malloc:

bce6f9e0c62052ca4f5a3d4aee81f777.png

参数:size申请堆内存大小。

返回: 成功返回内存地址,失败返回NULL

macllo内存格式:

1b069d191a2e4f0a422e9e2171bf480c.png

(注意博主在vs2015中内存结构如上图所示,不同编译器有所不同)

堆类别决定系统如何管理这个块内存。

4279cd1916904abe2c086771a1556e8c.png

我们首先查看 intP内存结构图:84b601d9d71da786ba011570643875ae.png

上图堆类别写错了,这里1是指这个堆是正常类别的堆。

我们可以从右侧观察窗口看到 intP保存的内存地址就是内存堆栈中实际使用地址即 0x010e8a78。而补充的对地址和实际使用地址相差 0x20大小。

我们查看一下 intP2 内存的地址为 0x010e4950intP指向的下一个对地址为 0x010E4930,当 0x010E4930+ 0x20= intP2。下图为 intP2内存结构图:ed27f770fa959ae2853ff456bfbfff1b.png

可以看到 intP2上一个堆地址加上20偏移正好就是 IntP

如果开发者想在堆中添加调试信息请用如下api:

c8ec424f9ea43bd24803aaa3e6ab5ea3.png

blockType是对堆的类别 枚举如下:

define FREEBLOCK 0

define NORMALBLOCK 1

define CRTBLOCK 2

define IGNOREBLOCK 3

define CLIENTBLOCK 4

define MAXBLOCKS 5

define UNKNOWNBLOCK (-1)

举例说明:

0fa63fed55177d9c8fa2789e36b414be.png

62021f935c59117e36cd944101e95357.png我们跳转到对应的常量池地址610837c714c80afbcfaa7b89ac388c94.png

free:

a5c17f31f08164d3c4eb10ef2e87ef2b.png

释放 memblock指向的内存。

我们看下free释放前后的区别:

释放前:fdff6930d11eabb02b20532e1a8b9ba3.png释放后:765c1d968a7a99650c0ce48592cab24b.png同时修改上下级堆链表的内存,这里就不做讲解了。(堆内存结构会存储一个上一个堆地址和下一个堆地址,当删除一个堆的时候会进行链表删除操作)

calloc和realloc

calloc

afbc630fb46ce146f5a8cecd41faf35f.png

申请 number*size的内存大小

90edba36e6937fe80671a06d6d5289f8.png

realloc重新给指向的地址分配新的大小。

fdeb265ba4987fe238921865dafd0461.png

注意 realloc会拷贝旧内存数据到新内存地址,而后释放旧堆。并且如果新生申请内存大小大于旧的大小。不管是缩小还是放大新堆都容易引起内存碎片问题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值