專利名稱:程序設計語言中管理指針的方法及系統的制作方法
技術領域:
本發明涉及對計算機指針的管理,特別涉及一種程序設計語言中管理指針的方法及系統。
背景技術:
電腦程序設計語言一般使用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集團股份有限公司