一个动态内存管理模块的实现

一个动态内存管理模块的实现

ID:25813436

大小:51.50 KB

页数:6页

时间:2018-11-22

一个动态内存管理模块的实现_第1页
一个动态内存管理模块的实现_第2页
一个动态内存管理模块的实现_第3页
一个动态内存管理模块的实现_第4页
一个动态内存管理模块的实现_第5页
资源描述:

《一个动态内存管理模块的实现》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库

1、一个动态内存管理模块的实现

2、第1内容加载中...摘要:介绍一个动态内存管理模块,可以有效地检测C程序中内存泄漏和写内存越界等错误,适用于具有标准C语言开发环境的各种平台。引言当前,绝大多数嵌入式平台上的软件都采用C语言编写。除了代码简洁、运行高效之外,灵活操作内存的能力更是C语言的重要特色。然而,不恰当的内存操作通常也是错误的根源之一。如“内存泄漏”——不能正确地释放已分配的动态内存,就是一种非常难于检测的存错误。持续的内存泄漏会使程序性能下降到最终完全不能运行,进而影响到所有其它有动态内存需求的程序,在某些相对简单的嵌入式平台上甚至会妨碍操作系统的运转。再如“写内存越界”,一种不

3、合法的写内存操作,极可能破坏到本程序中正在使用的其它数据,严重的时候还可能对其它正在运行的程序甚至整个系统造成影响。为此,本文介绍一个增强的、可定制的动态内存管理模块(以下不妨简称Fense),在C语言提供的内存分配函数基础上,增加了对动态内存的管理功能;能记录软件运行过程中出现的内存泄漏信息,同时也具一定的监测内存操作的能力;可以发现绝大多数对动态内存的写越界错误。1Fense的设计原理Fense通过设立一个双向链表(structHead*stHead)来保存所有被分配的动态内存块的信息。链表中的每个节点对应一个动态内存块,节点中包括此内存大小、分配发生时所在的源文件名和行号以及

4、被释放的时候,Fense又从st_Head中删除之,检查st_Head中的节点即可得到未被释放的本节点的数值校验和等。Fense将每一个分配的动态内存块插入到链表st_Head中;当此内存放内存块信息。链表节点结构定义如下:structHead{charfile;/分配所在源文件名*/unsignedlongline;/*分配所在的行号*/size_tsize;/*分配的内存大小*/intchecksum;/*链表节点校验和*/structHeadprev,next;/*双链表的前后节点指针*/};/*全局的双向链表*/structHead*st_Head=NULL;为了检测写越界

5、的错误,Fense在用户申请的内存前后各增加了一定大小的内存作为监测区域,并初始化成预定值。这样,当程序发生越界写操作时,预定值就会发生改变,Fense即可检测到错误。通过Fense分配到的动态内存结构如图1所示。由此可知,Fense_Malloc(Fense的内存分配函数)返回给用户的指针ptr指向的是用户申请内存区域的起始位置。链表节点、前/后监测区域均为Fense内部使用,是用户不可见的。500)this.style.ouseg(this)">2用户定制选项Fense有5组宏定义提供给用户对功能进行定制。各组选项控制意义如下:ALLOC用户申请零分配空间时警告信息。FILL_

6、ON_MALLOC分配时初始化内存块FILL_ON_MALLOC_VAL分配初始化时的预设值FILL_ON_FREE释放时填充内存块FILL_ON_FREE_VAL释放时填充内存块的预设值以上4个选项的主要功能是初始化刚分配到的内存和刚被释放的内存为预设值,尽可能地避免出现因使用未初始经的内存而引发的错误。FENSE_FRONT_SIZE定义前监测区域大小FENSE_FRONT_VAL定义前监测区域的预设值FENSE_END_SIZE定义后监测区域大小FENSE_END_VAL定义后监测工域的预设值在Fense工作过程中,对内存越界写操作的检验是通过比较监测区域的当前值与本监测区域

7、的预设值来确定的。显然不能排除这样一种可能:即发生在监测区域的越界写操作写入的数值与监测区域的预设值恰好相同,此时,Fense无法发现错误的发生。对于这种情况,用户可以通过更改监测区域预设值(FENSE_FRONT_VAL和FENSE_END_VAL)和监测区域大小(FENSE_FRONT_SIZE和FENSE_END_SIZE)为多组不同的值来反复测试,这样就可以大幅度地提高监测的准确性。VALIDATE_FREEfree是检查本内存块是否在链表中CHECK_ALL_MEMORY_ON_FREEfree时检查链表中的所有内存块由于存在这样一种情况:对内存块A的写操作出现了越界错误

8、,写到了另一内存块B的区域内。此时,仅仅检查内存块A的有效性就无法发现问题,如果同时检查所有的动态内存块,则有可能发现错误所在。以上选项即为此而设。FENSE_LOCK获取对链表st_Head的操作权FENSE_UNLOCK释放对链表st_Head的操作权考虑到的在多线程环境中,可能有多个线程同时用Fense进行内存管理,而Fense使用的链表st_Head是全局变量,因此提供了以上2个宏来实现对st_Head的互斥访问。宏的具体定义依赖于用户所在的软件环境,用户可自

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。