CN102156631B - 程序设计语言中管理指针的方法及系统 - Google Patents
程序设计语言中管理指针的方法及系统 Download PDFInfo
- Publication number
- CN102156631B CN102156631B CN201110106884.5A CN201110106884A CN102156631B CN 102156631 B CN102156631 B CN 102156631B CN 201110106884 A CN201110106884 A CN 201110106884A CN 102156631 B CN102156631 B CN 102156631B
- Authority
- CN
- China
- Prior art keywords
- pointer
- internal memory
- value
- node
- chained list
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Expired - Fee Related
Links
Landscapes
- Debugging And Monitoring (AREA)
- Memory System (AREA)
Abstract
本发明公开了程序设计语言中管理指针的方法及系统,其方法包括:A、获取指针的值;B、判断指针缓冲链表中是否存在该指针的地址位;如果是,执行步骤C;否则,执行步骤D;C、判断所述地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值;如果是,执行步骤E;否则,执行步骤D;D、返回假,判定该指针为野指针;E、返回真。返回真时表示指针有效,可以使用;返回假时表示指针是野指针,不能使用。当得出野指针的结论时,释放这个野指针对应的内存、并删除该指针对应的节点,从而杜绝了野指针的错误访问。
Description
技术领域
本发明涉及对计算机指针的管理,特别涉及一种程序设计语言中管理指针的方法及系统。
背景技术
电脑程序设计语言一般使用C/C++语言或者汇编语言,这些程序语言均使用指针这种数据类型。指针是指向一块内存的地址,它类似于房屋的门牌号,门牌号是找到房屋是唯一的办法,房屋被拆除后,通过门牌号将找不到对应的房屋,此时的门牌号就是野门牌号。相应的,此时的指针称之为野指针。
如果野指针在程序运行时使用,将直接导致造成程序退出,程序的退出是当操作系统检测到不合法的内存操作后做出的反应,因为程序运行于操作系统之上,内存是操作系统最重要的资源之一。而所有的程序均运行于内存中,如果内存被滥改,会严重影响应用程序和系统的正常运行。可见程序只能操作属于自己开辟的内存,这是它必须遵守的规则。
目前,操作系统的内存策略是直接杀掉访问野指针的程序,在使用C/C++语言开发程序的过程中,程序员凭借严谨逻辑思维和详细的测试仍然不能保证程序中没有野指针。
发明内容
鉴于上述现有技术的不足之处,本发明的目的在于提供一种程序设计语言中管理指针的方法及系统,能对指针进行查询,当查询到野指针时,可将野指针对应的内存和指针缓冲链表中相应的节点删除。
为了达到上述目的,本发明采取了以下技术方案:
一种程序设计语言中管理指针的方法,其中,包括:
A0、建立并维护指针缓冲链表;所述指针缓冲链表包括节点,所述节点包括标识位和地址位;其中,该指针缓冲链表的初始值为空;
A、获取指针的值;
B、判断指针缓冲链表的各节点中是否存在地址位的值与该指针的值相同的节点;如果是,执行步骤C;否则,执行步骤D;
C、判断所述节点的地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值;如果是,执行步骤E;否则,执行步骤D;
D、返回假,判定该指针为野指针;
E、返回真;
所述的方法还包括:当系统成功申请一块内存时,在该内存的第一个整数区写入全局计数器的值,并维护指针缓冲链表中的数据;其具体包括:
系统调用动态内存分配函数申请内存;
当成功申请一块内存时,返回指向该内存的指针,同时将全局计数器的值自动加1;
在该内存第一个整数区写入全局计数器此时的值;
将该全局计数器的值和指针一起组成一个节点,并将该节点新增到指针缓冲链表中。
所述的程序设计语言中管理指针的方法,其中,在步骤D之后,所述的方法还包括:释放野指针的内存,并更新指针缓冲链表。
所述的程序设计语言中管理指针的方法,其中,释放野指针的内存,并更新指针缓冲链表的步骤具体包括:
调用动态内存释放函数,并释放野指针指向的内存块;
在指针缓冲链表中查找包含该野指针的节点;
删除该节点。
一种程序设计语言中管理指针的系统,其中,包括:指针获取单元,用于获取指针的值;指针识别单元,用于判断指针缓冲链表的各节点中是否存在地址位的值与该指针的值相同的节点;指针查询单元,用于判断所述地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值;真假返回单元,用于在所述节点的地址位对应的标识位与所述指针指向的内存的第一个整数区的值相同时返回真;在指针缓冲链表中不存在所述指针的地址位,或者在指针缓冲链表中存在所述指针的地址位,但所述地址位对应的标识位与所述指针指向的内存的第一个整数区的值不同时返回假;
内存分配单元,用于在系统成功申请一块内存时,在内存第一整数区写入全局计数器的值,并维护指针缓冲链表中的数据;
其中,所述内存分配单元包括内存申请子单元、自动计数子单元、计数值写入子单元和节点新增子单元;
所述内存申请子单元用于调用动态内存分配函数申请内存;
所述自动计数子单元用于在增加新的指针时,返回指向该内存的指针,同时将全局计数器的值自动加1;
所述计数值写入子单元用于在该内存的第一整数区写入全局计数器此时的值;
所述节点新增子单元用于将全局计数器的值和指针一起组成一个节点,并将该节点新增到指针缓冲链表中。
所述的程序设计语言中管理指针的系统,其中,还包括内存销毁单元,用于释放野指针的内存,并更新指针缓冲链表。
本发明提供的一种程序设计语言中管理指针的方法及系统,在指针缓冲链表中存在指针的地址位时,判断该地址位对应的标识位与该地址指向的内存的第一个整数区的数值具有相同的值,当这两个值不同时判定为野指针,释放这个野指针对应的内存、并删除该指针对应的节点,从而杜绝了野指针的错误访问,还能把所有不用的内存释放出来。
附图说明
图1为本发明程序设计语言中管理指针的方法较佳实施例的流程图。
图2为本发明程序设计语言中管理指针的方法较佳实施例中指针缓冲链表的示意图。
图3为本发明程序设计语言中管理指针的方法较佳实施例中内存销毁函数释放内存的流程图。
图4为本发明程序设计语言中管理指针的方法较佳实施例中内存分配函数分配内存的流程图。
具体实施方式
本发明提供一种程序设计语言中管理指针的方法及系统,为使本发明的目的、技术方案及效果更加清楚、明确,以下参照附图并举实例对本发明进一步详细说明。应当理解,此处所描述的具体实施例仅用以解释本发明,并不用于限定本发明。
如图1所示,图1为本发明程序设计语言中管理指针的方法较佳实施例的流程图,本发明程序设计语言中管理指针的方法包括以下步骤:
步骤S110、获取指针的值。
该指针的值是指指针本身存储的数值,同时也是指针所指向的内存区的首地址。
步骤S120、判断指针缓冲链表中是否存在该指针的地址位;如果是,执行步骤S130;否则,执行步骤S140。
其中,判断指针缓冲链表中是否存在该指针的地址通过查询指针缓冲链表中的各节点是否存在与所述指针具有相同数值的地址位来判断。
在本实施方式中,系统设立一个全局计数器,该全局计数器是一个的整数变量,在系统启动后一直存在,其初始值为0,每成功申请一块内存时,全局计数器的计数值自动加一,如果内存申请了X次,则全局计数器的值为X。这个X可用于区分不同的内存申请者,保证其唯一性,因此X就代表申请者的ID(IDentity,身份标识号码)。内存成功申请后将X同时写入指针缓冲链表和该内存的第一个整数区。
指针缓冲链表是一个预先定义的、包含内存信息的映射表,如图2所示。指针缓冲链表由节点构成,所述节点包括标识位和地址位,该标识位为一个计数值,地址位用于存放内存地址。指针缓冲链表的初始值为空,即无节点。系统每次成功申请到一块内存时,在该指针缓冲链表中动态增加一个节点,并记录内存信息到节点中,即将当时全局计数器的值(自动加一后的数值)写到标识位中,对节点做标识,同时将指针返回的内存空间的首地址记录到地址位。每当系统释放掉一块内存时,在指针缓冲链表中删除相应的节点。
步骤S130、判断所述地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值;如果是,执行步骤S150;否则,执行步骤S140。
在具体实施时,需要从指针缓冲链表中获取该地址位对应的标识位,并且,获取该地址指向的内存的第一个整数区的数值,之后再判断两个值是否相同。
步骤S140、返回假,判定该指针为野指针。
步骤S150、返回真。
其中,在步骤S110之前,所述的方法还可包括:建立并维护指针缓冲链表。
其中,指针的识别依赖于指针缓冲链表。当系统返回“假”时,表示指针为野指针,不能使用,系统可跳过对它的处理或者执行其他对策程序;当系统返回“真”时,表示指针有效,可以使用。
在本实施方式中,当系统识别指针为野指针时,将释放该野指针的内存,并更新指针缓冲链表。其中,释放野指针的内存通过内存销毁单元实现,该内存销毁单元用于释放系统内存,删除指针缓冲链表中的节点更新指针缓冲链表。如图3所示,在释放内存时,先调用free函数(动态内存释放函数),并释放野指针指向的内存块;之后,在指针缓冲链表中查找包含该野指针的节点;然后,删除该节点。
在系统每次成功申请到一块内存时,在该内存的第一个整数区写入全局计数器的值,并维护指针缓冲链表中的数据,如图4所示,具体可通过下述方式实现:
第一步、系统调用malloc函数(动态内存分配函数)申请内存;第二步、如果申请成功则返回指向该内存的指针同时将全局计数器的值加1;第三步、在该内存的第一个整数区写入全局计数器当时的值;第四步、将该全局计数器的值和指针一起组成一个节点,并将该节点新增到指针缓冲链表中。
本发明实施例通过步骤S120可以确认指针是否已经被申请,如果指针缓冲链表中存在该指针的地址,则表示该指针指向的内存已经被申请过,如果指针缓冲链表中不存在该指针的地址,则表示该指针指向的内存目前未被申请。对于指针缓冲链表中存在该指针的地址的情形,还需要再通过步骤S130解决相同的指针,不同的申请者的问题。
其中,系统对内存的管理为:内存服务回应程序对内存的申请时,提出需要的内存尺寸,系统在内存空间中查找一块相同尺寸的连续的内存块,并返回内存块的首地址给申请方,这个首地址表现为指针。可见申请者得到的指针是由系统分配,地址带有不可预知性,而同样频繁的申请、销毁、再申请就会出现一种可能性:在不同阶段申请内存得到两个指向相同地址的指针,在这两个指针中,至少有一个指针是已被销毁过的,这样同一个指针对于申请者A是野指针,但是对于申请者B却是有效指针。本发明实施例,通过全局计数器来解决这个的难题。在指针识别时将指针缓冲链表的地址位对应的标识位和内存的第一个整数区的数值进行比较,上述地址位对应的标识位是指与该地址位处于同一个节点的标识位,由于每次成功申请到内存时系统会将当时全局计数器的值同时写入到对应节点的标识位和内存的第一个整数区中,因此该标识位和第一个整数区的数值可以用于标识相同的内存,如果这两个数值相同,则表示指针有效,否则判定为野指针。
本发明实施例还提供一种程序设计语言中管理指针的系统,其包括指针获取单元、指针识别单元、指针查询单元和真假返回单元。
其中,指针获取单元,用于获取指针的值。指针识别单元,用于判断指针缓冲链表中是否存在该指针的地址位。指针查询单元,用于判断所述地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值。真假返回单元,用于在所述地址位对应的标识位与所述指针指向的内存的第一个整数区的值相同时返回真,在指针缓冲链表中不存在所述指针的地址位或者在指针缓冲链表中存在所述指针的地址位,但所述地址位对应的标识位与所述指针指向的内存的第一个整数区的值不同时返回假。当返回值为真时表示指针有效,可以使用,当返回值为假时表示指针是野指针,不能使用。
其中,所述指针缓冲链表由节点构成,所述节点包括标识位和地址位,该标识位为一个计数值,地址位用于存放内存地址。指针缓冲链表的初始值为空,即无节点。
本发明实施例提供的程序设计语言中管理指针的系统还包括全局计数器、内存分配单元和内存销毁单元。
所述全局计数器是一个的整数变量,采用4个字节存储。全局计数器在系统内存中常驻,其初始值为0,它只允许在内存分配单元中被修改,且在系统成功申请一块内存时,全局计数器的值自动加1。所述内存分配单元用于在系统成功申请一块内存时,在该内存的第一个整数区写入全局计数器的值,并维护指针缓冲链表中的数据。具体地,所述内存分配单元主要完成系统的内存分配任务,更新指针缓冲链表,并返回指向该内存的指针。该内存分配单元分配的内存大小,以字节为单位。
其中,所述内存分配单元包括内存申请子单元、自动计数子单元、计数值写入子单元和节点新增子单元。
所述内存申请子单元用于调用malloc函数申请内存;所述自动计数子单元用于在增加新的指针时,返回指向该内存的指针,同时将全局计数器的值自动加1;所述计数值写入子单元用于在该内存的第一整数区写入全局计数器此时的值;所述节点新增子单元用于将全局计数器的值和指针一起组成一个节点,并将该节点新增到指针缓冲链表中。
所述内存销毁单元用于释放野指针的内存,并更新指针缓冲链表。其中,所述内存销毁单元具体包括内存释放子单元、节点查询子单元和节点删除子单元。
所述内存释放子单元用于在释放野指针的内存时,调用动态内存释放函数,并释放野指针指向的内存块;节点查询子单元用于在指针缓冲链表中找到包含该指针的节点;节点删除子单元用于删除指针缓冲链表中的所述节点。
本发明实施例提供的程序设计语言中管理指针的方法及系统,通过指针查询函数判断指针是否有效,当指针查询函数返回假时,判定该指针为野指针;当指针查询函数返回真时,通过比较指针缓冲链表中指针对应的标识位与该指针所指向的内存的第一个整数区的数值是否相同,当两个数值相同时,判定该指针有效,当两个数值不相同时判定该指针为野指针,从而可避免野指针带来的危害,而且还能把不使用的内存全部释放出来。
可以理解的是,对本领域普通技术人员来说,可以根据本发明的技术方案及其发明构思加以等同替换或改变,而所有这些改变或替换都应属于本发明所附的权利要求的保护范围。
Claims (5)
1.一种程序设计语言中管理指针的方法,其特征在于,包括:
A0、建立并维护指针缓冲链表;所述指针缓冲链表包括节点,所述节点包括标识位和地址位;其中,该指针缓冲链表的初始值为空;
A、获取指针的值;
B、判断指针缓冲链表的各节点中是否存在地址位的值与该指针的值相同的节点;如果是,执行步骤C;否则,执行步骤D;
C、判断所述节点的地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值;如果是,执行步骤E;否则,执行步骤D;
D、返回假,判定该指针为野指针;
E、返回真;
所述的方法还包括:当系统成功申请一块内存时,在该内存的第一个整数区写入全局计数器的值,并维护指针缓冲链表中的数据;其具体包括:
系统调用动态内存分配函数申请内存;
当成功申请一块内存时,返回指向该内存的指针,同时将全局计数器的值自动加1;
在该内存第一个整数区写入全局计数器此时的值;
将该全局计数器的值和指针一起组成一个节点,并将该节点新增到指针缓冲链表中。
2.根据权利要求1所述的程序设计语言中管理指针的方法,其特征在于,在步骤D之后,所述的方法还包括:释放野指针的内存,并更新指针缓冲链表。
3.根据权利要求2所述的程序设计语言中管理指针的方法,其特征在于,释放野指针的内存,并更新指针缓冲链表的步骤具体包括:
调用动态内存释放函数,并释放野指针指向的内存块;
在指针缓冲链表中查找包含该野指针的节点;
删除该节点。
4.一种程序设计语言中管理指针的系统,其特征在于,包括:
指针获取单元,用于获取指针的值;
指针识别单元,用于判断指针缓冲链表的各节点中是否存在地址位的值与该指针的值相同的节点;
指针查询单元,用于判断所述节点的地址位对应的标识位与所述指针指向的内存的第一个整数区是否具有相同的值;
真假返回单元,用于在所述地址位对应的标识位与所述指针指向的内存的第一个整数区的值相同时返回真;在指针缓冲链表中不存在所述指针的地址位,或者在指针缓冲链表中存在所述指针的地址位,但所述地址位对应的标识位与所述指针指向的内存的第一个整数区的值不同时返回假;
内存分配单元,用于在系统成功申请一块内存时,在内存第一整数区写入全局计数器的值,并维护指针缓冲链表中的数据;
其中,所述内存分配单元包括内存申请子单元、自动计数子单元、计数值写入子单元和节点新增子单元;
所述内存申请子单元用于调用动态内存分配函数申请内存;
所述自动计数子单元用于在增加新的指针时,返回指向该内存的指针,同时将全局计数器的值自动加1;
所述计数值写入子单元用于在该内存的第一整数区写入全局计数器此时的值;
所述节点新增子单元用于将全局计数器的值和指针一起组成一个节点,并将该节点新增到指针缓冲链表中。
5.根据权利要求4所述的程序设计语言中管理指针的系统,其特征在于,还包括内存销毁单元,用于释放野指针的内存,并更新指针缓冲链表。
Priority Applications (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110106884.5A CN102156631B (zh) | 2011-04-27 | 2011-04-27 | 程序设计语言中管理指针的方法及系统 |
Applications Claiming Priority (1)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
CN201110106884.5A CN102156631B (zh) | 2011-04-27 | 2011-04-27 | 程序设计语言中管理指针的方法及系统 |
Publications (2)
Publication Number | Publication Date |
---|---|
CN102156631A CN102156631A (zh) | 2011-08-17 |
CN102156631B true CN102156631B (zh) | 2015-04-15 |
Family
ID=44438139
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN201110106884.5A Expired - Fee Related CN102156631B (zh) | 2011-04-27 | 2011-04-27 | 程序设计语言中管理指针的方法及系统 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN102156631B (zh) |
Families Citing this family (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103473319B (zh) * | 2013-09-12 | 2017-02-15 | 中国科学院声学研究所 | 一种热点数据的统计方法 |
CN108762920A (zh) * | 2018-05-18 | 2018-11-06 | 四川斐讯信息技术有限公司 | 一种动态内存中野指针的确定及定位方法 |
CN109144902A (zh) * | 2018-07-10 | 2019-01-04 | 北京佳讯飞鸿电气股份有限公司 | 内存的申请使用方法及装置 |
Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0352034A (ja) * | 1989-07-20 | 1991-03-06 | Nec Corp | Cコンパイラのメモリ割付け方式 |
CN101551736A (zh) * | 2009-05-20 | 2009-10-07 | 杭州华三通信技术有限公司 | 基于地址指针链表的缓存管理装置和方法 |
CN101599046A (zh) * | 2009-06-26 | 2009-12-09 | 深圳市茁壮网络股份有限公司 | 一种内存检测方法及装置 |
CN101286880B (zh) * | 2008-05-07 | 2010-09-01 | 中兴通讯股份有限公司 | 管理对象创建方法和装置 |
Family Cites Families (1)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
US8245209B2 (en) * | 2007-05-29 | 2012-08-14 | International Business Machines Corporation | Detecting dangling pointers and memory leaks within software |
-
2011
- 2011-04-27 CN CN201110106884.5A patent/CN102156631B/zh not_active Expired - Fee Related
Patent Citations (4)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
JPH0352034A (ja) * | 1989-07-20 | 1991-03-06 | Nec Corp | Cコンパイラのメモリ割付け方式 |
CN101286880B (zh) * | 2008-05-07 | 2010-09-01 | 中兴通讯股份有限公司 | 管理对象创建方法和装置 |
CN101551736A (zh) * | 2009-05-20 | 2009-10-07 | 杭州华三通信技术有限公司 | 基于地址指针链表的缓存管理装置和方法 |
CN101599046A (zh) * | 2009-06-26 | 2009-12-09 | 深圳市茁壮网络股份有限公司 | 一种内存检测方法及装置 |
Also Published As
Publication number | Publication date |
---|---|
CN102156631A (zh) | 2011-08-17 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
US7827375B2 (en) | Defensive heap memory management | |
CN107273455B (zh) | 区块链数据访问方法和装置 | |
US7181585B2 (en) | Defensive heap memory management | |
US6542167B1 (en) | System and method for flexible software linking | |
US6249793B1 (en) | Mostly concurrent compaction in a garbage collection system | |
EP0848324B1 (en) | Using three-state references to manage access to referenced objects | |
CN101599046B (zh) | 一种内存检测方法及装置 | |
US9804963B1 (en) | Hardware-protected reference count-based memory management using weak references | |
CN100383793C (zh) | 一种在实时数据库中实现更新数据的方法和系统 | |
KR20010082032A (ko) | 영구적이고 확실한 저장 할당을 위한 시스템 및 방법 | |
CN111324451A (zh) | 一种基于lte协议栈的内存块越界的定位方法及其系统 | |
CN101110042A (zh) | 一种检测内存访问越界的方法 | |
CA2608282A1 (en) | Secure storage management system and method | |
US7472144B2 (en) | Method and system for resolving memory leaks and releasing obsolete resources from user session data | |
CN107783908B (zh) | 一种基于Linux内核内存泄露的检测方法 | |
US20060253503A1 (en) | Method and apparatus for aging a versioned heap system | |
CN107704573A (zh) | 一种与业务耦合的智能缓存方法 | |
CN102156631B (zh) | 程序设计语言中管理指针的方法及系统 | |
CN110287695B (zh) | 一种Java卡及其临时对象的管理方法 | |
US7469319B2 (en) | Methods and apparatuses for mappable shared cache management | |
CN102541969A (zh) | 基于fat文件系统的文件保护方法、系统及存储器 | |
CN106326014A (zh) | 一种资源访问方法及装置 | |
CN101515242A (zh) | 一种查找改写内存的任务的方法和系统 | |
WO2007073926A2 (en) | Memory architecture and access method | |
US20080162610A1 (en) | Database garbage collector |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C14 | Grant of patent or utility model | ||
GR01 | Patent grant | ||
CF01 | Termination of patent right due to non-payment of annual fee | ||
CF01 | Termination of patent right due to non-payment of annual fee |
Granted publication date: 20150415 |