关于windows下堆内存的申请与释放

本文探讨了在Windows环境下,使用C语言的malloc函数动态申请内存和free函数释放内存的过程。通过分析源码,解释了Windows如何在内存释放时记录和处理内存大小信息。
摘要由CSDN通过智能技术生成

版权所有,转载请注明出处,谢谢!
http://blog.csdn.net/walkinginthewind/article/details/7069176

我们都知道,C语言中要动态申请内存需要调用malloc函数,释放动态内存需要调用free函数。内存的申请与释放都是在堆(Heap)上进行的。当然,所谓的内存,都是虚拟内存。

C语言中的malloc和free,在windows中主要是通过HeapAlloc和HeapFree来实现的。
每个进程在初始化的时候,会调用RtlProcessHeap()函数构造进程的HEAP对象,这个对象用来管理进程的堆内存。
当我们使用malloc申请一段内存时,我们要指定大小,但是使用free释放的时候,只是指定要释放的内存起始地址即可。
如:
int * p = (int*)malloc(100 * sizeof(int)); // 申请100个int大小的一段内存
... // 其他操作
free(p); // 释放p所指向的内存
那么我们必定会产生疑问,系统是怎么知道或记录给定指针所指向的动态内存的大小的呢?
windows的实现方案很简单,就是在每一段动态内存的上部保存该段内存的大小等相关信息,这也就说明了,当我们使用堆内存时,会有额外的系统开销,windows中是通过如下一个结构体来保存相关信息的:
(WRK中的定义&#x
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值