一种分块内存的申请和释放方法
技术领域
本发明涉及一种通信设备中分块内存的申请和释放方法。
背景技术
在现代通信设备中,内存是其主要组成部分。通信设备中内存的主要作用在于临时存储系统需要暂存的数据,在系统处理过程中调用内存中存储的数据,在处理完毕后则清除内存中的数据,以便于新的数据存入。现有技术的内存管理方法一般是预先向操作系统申请一块存储量较大的内存区,再将该内存区划分为若干内存池,每个内存池中又划分为若干存储量大小不一且固定不变的内存块,各种存储量大小内存块的数量可根据需要配置。当程序需要使用内存时(例如为一个指针变量申请一块内存),需先申请一块内存,程序会根据具体需要申请的内存存储量大小寻找合适的内存块,将分配的内存块起始地址返回给程序的指针变量。而当程序不再继续使用内存时,就会释放上述内存块。常用的释放方法就是将该指针判断为空指针,如果不是空指针则释放该指针指向的分块内存。
由于程序越来越复杂和庞大,现有的分块内存申请和释放方法较为简单,当发生内存越界等异常情况后,极有可能造成极大的破坏。以前述指针变量释放内存为例,当发生内存越界后,指针变量的值有可能已经被修改,申请的内存块也有可能已经被修改和破坏,而现有技术的分块内存释放方法是无法获知这些信息的,通过判断指针不为空的方式直接释放该指针所指向的内存,极有可能破坏其他的系统数据,对系统带来极大的风险,导致灾难性的后果。
发明内容
本发明提出一种新的分块内存申请和释放方法,能在很大程度上保证在没有发生内存越界等异常情况的前提下正确释放分块内存,克服现有技术简单的内存释放给系统带来严重的后果等缺点,对系统起到保护作用。另外,在发生内存越界等异常情况时,还可以根据需要进行断言(简称为assert)等相应的处理。
本发明内存申请和释放方法将内存块定义为包括头部扩展区和消息区的结构,根据所需内存存储量的大小选择申请内存的方式,并根据申请内存的方式选择释放内存的方式。
本发明内存申请和释放方法可根据需要设定内存块头部扩展区的内容和长度,内存块头部扩展区存储内存块状态等信息,存储消息的消息区设置在头部扩展区后。
本发明内存申请和释放方法在所需内存的存储量小于或等于系统内存块最大存储量时,将分配内存块的头部扩展区中的内存块状态信息置成“已申请”,将消息区的起始地址返回给程序,否则,采用现有技术的MALLOC或其他方式申请。
本发明内存申请和释放方法在程序需要释放内存时,首先判断是否为采用现有技术的MALLOC或其他方式申请的内存,如是则采用现有技术的FREE或其他方式释放。否则,进一步判断该内存块头部扩展区中的内存块状态信息,如果是“已申请”则正常释放该内存并将头部扩展区中的内存块状态信息置成“已释放”,否则,根据需要进行相应处理(如assert)。
本发明内存申请和释放方法包括以下步骤:
1、定义分块内存的内存块结构,包括头部扩展区和消息区,并根据需要设定头部扩展区的内容和长度,头部扩展区存储内存块状态等信息,存储消息的消息区设置在头部扩展区后;
2、当程序需要申请内存时,根据所需内存存储量的大小可采用两种方式进行申请:
方式1:所需内存的存储量小于或等于系统内存块最大存储量,将分配内存块的头部扩展区中的内存块状态信息置成“已申请”,将消息区的起始地址返回给程序;
方式2:所需内存的存储量大于系统内存块最大存储量,采用现有技术的MALLOC或其他方式申请;
3、当程序需要释放该内存时,根据不同的内存申请的方式采取相应的释放方式:
采用方式1申请的内存:判断该分块内存头部扩展区中的内存块状态信息,如果是“已申请”,表明该内存块没有被破坏或者被破坏的几率很小,可以正常释放该内存并将头部扩展区中的内存块状态信息置成“已释放”,否则,表明内存块已经被破坏,可以根据需要进行相应处理(如assert);
采用方式2申请的内存:采用现有技术的FREE或其他方式释放。
本发明内存申请和释放方法与现有技术相比,在分块内存中设置了内存块状态信息,在分块内存的申请和释放时,对该状态信息进行设置和判断,能很大程度上保证在没有发生内存越界等异常情况的前提下正确释放分块内存,对系统起到保护作用。另外,在发生内存越界等异常情况时,还可以根据需要进行assert处理,便于查找问题,非常利于程序调试。
附图说明
图1本发明内存申请和释放方法分块内存实施例的结构示意图;
图2本发明内存申请和释放方法分块内存的申请流程图;
图3本发明内存申请和释放方法分块内存的释放流程图。
下面结合附图及具体实施方式对本发明判断方法做详细的说明。
附图1是本发明内存申请和释放方法分块内存实施例的结构示意图。在此实施例中,内存块存储量占64字节为例,由头部扩展区和消息区组成,头部扩展区2字节存放内存块状态信息(取值详见表1),消息区62字节存放消息。显然,内存块存储量的大小和头部扩展区存储量的大小可以在具体使用中根据需要设置。
表1:头部扩展区2字节存放内存块状态信息
内存块状态信息取值 |
意义 |
0xAA55 |
“已申请” |
0x55AA |
“已释放” |
其他值 |
保留,用于扩展 |
附图2是本发明内存申请和释放方法分块内存的申请流程图。在此实施例中设定程序需要申请一块存储量大小为X(单位为字节,下同)的内存。具体包括以下步骤:
1、程序需要申请一块存储量大小为X的内存;
2、比较(X+2)与系统设置的最大内存块存储量的大小;
3、如果(X+2)小于或等于系统设置的最大内存块存储量,系统找到存储量合适的内存块,将内存块头部扩展区的内存块状态信息置成0xAA55,然后将消息区的起始地址传递给程序,此为方式1;否则,继续执行下一步骤;
4、通过现有技术的MALLOC或者其他方式申请存储量大小为X的内存,此为方式2。
附图3是本发明内存申请和释放方法分块内存的释放流程图。具体包括以下步骤:
1、程序需要释放该内存;
2、判断该内存在申请时采用何种方式;
3、如果是方式1,则进一步判断该内存块的头部扩展区中的内存块状态信息是否为0xAA55,否则执行步骤6;
4、如果该内存块的头部扩展区中的内存块状态信息是0xAA55,则释放该内存块,并将该内存块头部信息置成0x55AA,否则,执行下一步骤;
5、根据需要进行assert或者其他方式的处理;
6、通过现有技术的FREE或者其他方式释放。
本发明方法还可有其他多种实施例,在不背离本发明方法的精神及其实质的情况下,本领域技术人员当可相据本发明方法作出各种相应的改变或变形,但这些相应的改变或变形均属于本发明方法的权利要求保护范围。