程序设计语言中管理指针的方法及系统的制作方法

文档序号:6423178阅读:107来源:国知局
专利名称:程序设计语言中管理指针的方法及系统的制作方法
技术领域
本发明涉及对计算机指针的管理,特别涉及一种程序设计语言中管理指针的方法及系统。
背景技术
电脑程序设计语言一般使用C/C++语言或者汇编语言,这些程序语言均使用指针这种数据类型。指针是指向一块内存的地址,它类似于房屋的门牌号,门牌号是找到房屋是唯一的办法,房屋被拆除后,通过门牌号将找不到对应的房屋,此时的门牌号就是野门牌号。相应的,此时的指针称之为野指针。如果野指针在程序运行时使用,将直接导致造成程序退出,程序的退出是当操作系统检测到不合法的内存操作后做出的反应,因为程序运行于操作系统之上,内存是操作系统最重要的资源之一。而所有的程序均运行于内存中,如果内存被滥改,会严重影响应用程序和系统的正常运行。可见程序只能操作属于自己开辟的内存,这是它必须遵守的规则。目前,操作系统的内存策略是直接杀掉访问野指针的程序,在使用C/C++语言开发程序的过程中,程序员凭借严谨逻辑思维和详细的测试仍然不能保证程序中没有野指针。

发明内容
鉴于上述现有技术的不足之处,本发明的目的在于提供一种程序设计语言中管理指针的方法及系统,能对指针进行查询,当查询到野指针时,可将野指针对应的内存和指针缓冲链表中相应的节点删除。为了达到上述目的,本发明采取了以下技术方案 一种程序设计语言中管理指针的方法,其中,包括
A、获取指针的值;
B、判断指针缓冲链表中是否存在该指针的地址位;如果是,执行步骤C;否则,执行步骤D;
C、判断所述地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值;如果是,执行步骤E ;否则,执行步骤D ;
D、返回假,判定该指针为野指针;
E、返回真。所述的程序设计语言中管理指针的方法,其中,在步骤A之前,所述的方法还包括建立并维护指针缓冲链表。所述的程序设计语言中管理指针的方法,其中,指针缓冲链表包括节点,所述节点包括标识位和地址位;其中,该指针缓冲链表的初始值为空。所述的程序设计语言中管理指针的方法,其中,所述的方法还包括当系统成功申请一块内存时,在该内存的第一个整数区写入全局计数器的值,并维护指针缓冲链表中的数据。所述的程序设计语言中管理指针的方法,其中,当系统成功申请一块内存时,在该内存的第一个整数区写入全局计数器的值,并维护指针缓冲链表中的数据的步骤具体包括
系统调用动态内存分配函数申请内存;
当成功申请一块内存时,返回指向该内存的指针,同时将全局计数器的值自动加1 ; 在该内存第一个整数区写入全局计数器此时的值;
将该全局计数器的值和指针一起组成一个节点,并将该节点新增到指针缓冲链表中。所述的程序设计语言中管理指针的方法,其中,在步骤D之后,所述的方法还包括释放野指针的内存,并更新指针缓冲链表。所述的程序设计语言中管理指针的方法,其中,释放野指针的内存,并更新指针缓冲链表的步骤具体包括
调用动态内存释放函数,并释放野指针指向的内存块; 在指针缓冲链表中查找包含该野指针的节点; 删除该节点。一种程序设计语言中管理指针的系统,其中,包括指针获取单元,用于获取指针的值;指针识别单元,用于判断指针缓冲链表中是否存在该指针的地址位;指针查询单元, 用于判断所述地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值;真假返回单元,用于在所述地址位对应的标识位与所述指针指向的内存的第一个整数区的值相同时返回真;在指针缓冲链表中不存在所述指针的地址位,或者在指针缓冲链表中存在所述指针的地址位,但所述地址位对应的标识位与所述指针指向的内存的第一个整数区的值不同时返回假。所述的程序设计语言中管理指针的系统,其中,还包括内存分配单元,用于在系统成功申请一块内存时,在内存第一整数区写入全局计数器的值,并维护指针缓冲链表中的数据。所述的程序设计语言中管理指针的系统,其中,还包括内存销毁单元,用于释放野指针的内存,并更新指针缓冲链表。本发明提供的一种程序设计语言中管理指针的方法及系统,在指针缓冲链表中存在指针的地址位时,判断该地址位对应的标识位与该地址指向的内存的第一个整数区的数值具有相同的值,当这两个值不同时判定为野指针,释放这个野指针对应的内存、并删除该指针对应的节点,从而杜绝了野指针的错误访问,还能把所有不用的内存释放出来。


图1为本发明程序设计语言中管理指针的方法较佳实施例的流程图。图2为本发明程序设计语言中管理指针的方法较佳实施例中指针缓冲链表的示意图。图3为本发明程序设计语言中管理指针的方法较佳实施例中内存销毁函数释放内存的流程图。图4为本发明程序设计语言中管理指针的方法较佳实施例中内存分配函数分配内存的流程图。
具体实施例方式本发明提供一种程序设计语言中管理指针的方法及系统,为使本发明的目的、技术方案及效果更加清楚、明确,以下参照附图并举实例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。如图1所示,图1为本发明程序设计语言中管理指针的方法较佳实施例的流程图, 本发明程序设计语言中管理指针的方法包括以下步骤
步骤S110、获取指针的值。该指针的值是指指针本身存储的数值,同时也是指针所指向的内存区的首地址。步骤S120、判断指针缓冲链表中是否存在该指针的地址位;如果是,执行步骤 S130 ;否则,执行步骤S140。其中,判断指针缓冲链表中是否存在该指针的地址通过查询指针缓冲链表中的各节点是否存在与所述指针具有相同数值的地址位来判断。在本实施方式中,系统设立一个全局计数器,该全局计数器是一个的整数变量,在系统启动后一直存在,其初始值为0,每成功申请一块内存时,全局计数器的计数值自动加一,如果内存申请了 X次,则全局计数器的值为X。这个X可用于区分不同的内存申请者, 保证其唯一性,因此X就代表申请者的ID (IDentity,身份标识号码)。内存成功申请后将 X同时写入指针缓冲链表和该内存的第一个整数区。指针缓冲链表是一个预先定义的、包含内存信息的映射表,如图2所示。指针缓冲链表由节点构成,所述节点包括标识位和地址位,该标识位为一个计数值,地址位用于存放内存地址。指针缓冲链表的初始值为空,即无节点。系统每次成功申请到一块内存时,在该指针缓冲链表中动态增加一个节点,并记录内存信息到节点中,即将当时全局计数器的值 (自动加一后的数值)写到标识位中,对节点做标识,同时将指针返回的内存空间的首地址记录到地址位。每当系统释放掉一块内存时,在指针缓冲链表中删除相应的节点。步骤S130、判断所述地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值;如果是,执行步骤S150 ;否则,执行步骤S140。在具体实施时,需要从指针缓冲链表中获取该地址位对应的标识位,并且,获取该地址指向的内存的第一个整数区的数值,之后再判断两个值是否相同。步骤S140、返回假,判定该指针为野指针。步骤S150、返回真。其中,在步骤SllO之前,所述的方法还可包括建立并维护指针缓冲链表。其中,指针的识别依赖于指针缓冲链表。当系统返回“假”时,表示指针为野指针, 不能使用,系统可跳过对它的处理或者执行其他对策程序;当系统返回“真”时,表示指针有效,可以使用。在本实施方式中,当系统识别指针为野指针时,将释放该野指针的内存,并更新指针缓冲链表。其中,释放野指针的内存通过内存销毁单元实现,该内存销毁单元用于释放系统内存,删除指针缓冲链表中的节点更新指针缓冲链表。如图3所示,在释放内存时,先调用free函数(动态内存释放函数),并释放野指针指向的内存块;之后,在指针缓冲链表中查找包含该野指针的节点;然后,删除该节点。在系统每次成功申请到一块内存时,在该内存的第一个整数区写入全局计数器的值,并维护指针缓冲链表中的数据,如图4所示,具体可通过下述方式实现
第一步、系统调用malloc函数(动态内存分配函数)申请内存;第二步、如果申请成功则返回指向该内存的指针同时将全局计数器的值加1 ;第三步、在该内存的第一个整数区写入全局计数器当时的值;第四步、将该全局计数器的值和指针一起组成一个节点,并将该节点新增到指针缓冲链表中。本发明实施例通过步骤S120可以确认指针是否已经被申请,如果指针缓冲链表中存在该指针的地址,则表示该指针指向的内存已经被申请过,如果指针缓冲链表中不存在该指针的地址,则表示该指针指向的内存目前未被申请。对于指针缓冲链表中存在该指针的地址的情形,还需要再通过步骤S130解决相同的指针,不同的申请者的问题。其中,系统对内存的管理为内存服务回应程序对内存的申请时,提出需要的内存尺寸,系统在内存空间中查找一块相同尺寸的连续的内存块,并返回内存块的首地址给申请方,这个首地址表现为指针。可见申请者得到的指针是由系统分配,地址带有不可预知性,而同样频繁的申请、销毁、再申请就会出现一种可能性在不同阶段申请内存得到两个指向相同地址的指针,在这两个指针中,至少有一个指针是已被销毁过的,这样同一个指针对于申请者A是野指针,但是对于申请者B却是有效指针。本发明实施例,通过全局计数器来解决这个的难题。在指针识别时将指针缓冲链表的地址位对应的标识位和内存的第一个整数区的数值进行比较,上述地址位对应的标识位是指与该地址位处于同一个节点的标识位,由于每次成功申请到内存时系统会将当时全局计数器的值同时写入到对应节点的标识位和内存的第一个整数区中,因此该标识位和第一个整数区的数值可以用于标识相同的内存,如果这两个数值相同,则表示指针有效,否则判定为野指针。本发明实施例还提供一种程序设计语言中管理指针的系统,其包括指针获取单元、指针识别单元、指针查询单元和真假返回单元。其中,指针获取单元,用于获取指针的值。指针识别单元,用于判断指针缓冲链表中是否存在该指针的地址位。指针查询单元,用于判断所述地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值。真假返回单元,用于在所述地址位对应的标识位与所述指针指向的内存的第一个整数区的值相同时返回真,在指针缓冲链表中不存在所述指针的地址位或者在指针缓冲链表中存在所述指针的地址位,但所述地址位对应的标识位与所述指针指向的内存的第一个整数区的值不同时返回假。当返回值为真时表示指针有效,可以使用,当返回值为假时表示指针是野指针,不能使用。其中,所述指针缓冲链表由节点构成,所述节点包括标识位和地址位,该标识位为一个计数值,地址位用于存放内存地址。指针缓冲链表的初始值为空,即无节点。本发明实施例提供的程序设计语言中管理指针的系统还包括全局计数器、内存分配单元和内存销毁单元。所述全局计数器是一个的整数变量,采用4个字节存储。全局计数器在系统内存中常驻,其初始值为0,它只允许在内存分配单元中被修改,且在系统成功申请一块内存时, 全局计数器的值自动加1。所述内存分配单元用于在系统成功申请一块内存时,在该内存的第一个整数区写入全局计数器的值,并维护指针缓冲链表中的数据。具体地,所述内存分配单元主要完成系统的内存分配任务,更新指针缓冲链表,并返回指向该内存的指针。该内存分配单元分配的内存大小,以字节为单位。其中,所述内存分配单元包括内存申请子单元、自动计数子单元、计数值写入子单元和节点新增子单元。所述内存申请子单元用于调用malloc函数申请内存;所述自动计数子单元用于在增加新的指针时,返回指向该内存的指针,同时将全局计数器的值自动加1 ;所述计数值写入子单元用于在该内存的第一整数区写入全局计数器此时的值;所述节点新增子单元用于将全局计数器的值和指针一起组成一个节点,并将该节点新增到指针缓冲链表中。所述内存销毁单元用于释放野指针的内存,并更新指针缓冲链表。其中,所述内存销毁单元具体包括内存释放子单元、节点查询子单元和节点删除子单元。所述内存释放子单元用于在释放野指针的内存时,调用动态内存释放函数,并释放野指针指向的内存块;节点查询子单元用于在指针缓冲链表中找到包含该指针的节点; 节点删除子单元用于删除指针缓冲链表中的所述节点。本发明实施例提供的程序设计语言中管理指针的方法及系统,通过指针查询函数判断指针是否有效,当指针查询函数返回假时,判定该指针为野指针;当指针查询函数返回真时,通过比较指针缓冲链表中指针对应的标识位与该指针所指向的内存的第一个整数区的数值是否相同,当两个数值相同时,判定该指针有效,当两个数值不相同时判定该指针为野指针,从而可避免野指针带来的危害,而且还能把不使用的内存全部释放出来。可以理解的是,对本领域普通技术人员来说,可以根据本发明的技术方案及其发明构思加以等同替换或改变,而所有这些改变或替换都应属于本发明所附的权利要求的保护范围。
权利要求
1.一种程序设计语言中管理指针的方法,其特征在于,包括A、获取指针的值;B、判断指针缓冲链表中是否存在该指针的地址位;如果是,执行步骤C;否则,执行步骤D;C、判断所述地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值;如果是,执行步骤E ;否则,执行步骤D ;D、返回假,判定该指针为野指针;E、返回真。
2.根据权利要求1所述的程序设计语言中管理指针的方法,其特征在于,在步骤A之前,所述的方法还包括建立并维护指针缓冲链表。
3.根据权利要求1或2所述的程序设计语言中管理指针的方法,其特征在于,指针缓冲链表包括节点,所述节点包括标识位和地址位;其中,该指针缓冲链表的初始值为空。
4.根据权利要求3所述的程序设计语言中管理指针的方法,其特征在于,所述的方法还包括当系统成功申请一块内存时,在该内存的第一个整数区写入全局计数器的值,并维护指针缓冲链表中的数据。
5.根据权利要求4所述的程序设计语言中管理指针的方法,其特征在于,当系统成功申请一块内存时,在该内存的第一个整数区写入全局计数器的值,并维护指针缓冲链表中的数据的步骤具体包括系统调用动态内存分配函数申请内存;当成功申请一块内存时,返回指向该内存的指针,同时将全局计数器的值自动加1 ;在该内存第一个整数区写入全局计数器此时的值;将该全局计数器的值和指针一起组成一个节点,并将该节点新增到指针缓冲链表中。
6.根据权利要求1所述的程序设计语言中管理指针的方法,其特征在于,在步骤D之后,所述的方法还包括释放野指针的内存,并更新指针缓冲链表。
7.根据权利要求6所述的程序设计语言中管理指针的方法,其特征在于,释放野指针的内存,并更新指针缓冲链表的步骤具体包括调用动态内存释放函数,并释放野指针指向的内存块;在指针缓冲链表中查找包含该野指针的节点;删除该节点。
8.一种程序设计语言中管理指针的系统,其特征在于,包括指针获取单元,用于获取指针的值;指针识别单元,用于判断指针缓冲链表中是否存在该指针的地址位;指针查询单元,用于判断所述地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值;真假返回单元,用于在所述地址位对应的标识位与所述指针指向的内存的第一个整数区的值相同时返回真;在指针缓冲链表中不存在所述指针的地址位,或者在指针缓冲链表中存在所述指针的地址位,但所述地址位对应的标识位与所述指针指向的内存的第一个整数区的值不同时返回假。
9.根据权利要求8所述的程序设计语言中管理指针的系统,其特征在于,还包括内存分配单元,用于在系统成功申请一块内存时,在内存第一整数区写入全局计数器的值,并维护指针缓冲链表中的数据。
10.根据权利要求8所述的程序设计语言中管理指针的系统,其特征在于,还包括内存销毁单元,用于释放野指针的内存,并更新指针缓冲链表。
全文摘要
本发明公开了程序设计语言中管理指针的方法及系统,其方法包括A、获取指针的值;B、判断指针缓冲链表中是否存在该指针的地址位;如果是,执行步骤C;否则,执行步骤D;C、判断所述地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值;如果是,执行步骤E;否则,执行步骤D;D、返回假,判定该指针为野指针;E、返回真。返回真时表示指针有效,可以使用;返回假时表示指针是野指针,不能使用。当得出野指针的结论时,释放这个野指针对应的内存、并删除该指针对应的节点,从而杜绝了野指针的错误访问。
文档编号G06F9/32GK102156631SQ20111010688
公开日2011年8月17日 申请日期2011年4月27日 优先权日2011年4月27日
发明者甘志文 申请人:Tcl集团股份有限公司
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1