專利名稱:編程對(duì)象簡(jiǎn)化的內(nèi)存重新分配的制作方法
技術(shù)領(lǐng)域:
本發(fā)明涉及對(duì)象的內(nèi)存管理(memory management,又稱存儲(chǔ)管理),更具體地,涉及為不同類的對(duì)象提供通用內(nèi)存管理代碼,以及釋放與對(duì)象層次中特定對(duì)象相關(guān)聯(lián)的內(nèi)存和與該層次中處于特定對(duì)象下層的對(duì)象相關(guān)聯(lián)的內(nèi)存。
背景技術(shù):
內(nèi)存管理是指為存儲(chǔ)對(duì)象或其它數(shù)據(jù)結(jié)構(gòu),管理內(nèi)存的分配和釋放所執(zhí)行的操作和處理。通常,大多數(shù)應(yīng)用程序使用編寫該程序的計(jì)算機(jī)語(yǔ)言提供的內(nèi)存管理代碼。然而,計(jì)算機(jī)語(yǔ)言提供的內(nèi)存管理代碼可能沒(méi)有某些想要的特性,例如性能的優(yōu)化,內(nèi)存分配的優(yōu)化或?yàn)橐唤M具有相互關(guān)系的對(duì)象釋放內(nèi)存。因此,有必要讓對(duì)象擁有自己的內(nèi)存管理代碼。
在面向?qū)ο蟮沫h(huán)境里,為應(yīng)用程序提供唯一的內(nèi)存管理代碼需要重載在該應(yīng)用程序內(nèi)每個(gè)被用來(lái)創(chuàng)建對(duì)象的類中新建運(yùn)算符和刪除運(yùn)算符。這樣做的問(wèn)題是,應(yīng)用程序中每一個(gè)被用來(lái)創(chuàng)建對(duì)象的類需要單獨(dú)的內(nèi)存管理代碼拷貝來(lái)重載這些類中的新建和刪除操作。有許多個(gè)內(nèi)存管理代碼拷貝不僅使程序的維護(hù)復(fù)雜化而且使程序升級(jí)復(fù)雜化。例如,任何時(shí)候在內(nèi)存管理代碼中發(fā)現(xiàn)一個(gè)錯(cuò)誤,在每一個(gè)類中的內(nèi)存管理代碼都必須被修改。
當(dāng)一組對(duì)象之間有相互關(guān)系時(shí),為了按正確的順序釋放與對(duì)象相關(guān)聯(lián)的內(nèi)存,一個(gè)應(yīng)用程序不得不跟蹤這些對(duì)象之間的關(guān)系。例如,對(duì)任何給定的數(shù)據(jù)庫(kù)連接,需要執(zhí)行一個(gè)或更多的包含語(yǔ)句的查詢,以及返回響應(yīng)查詢的結(jié)果集。因此在數(shù)據(jù)庫(kù)連接和相關(guān)的語(yǔ)句、結(jié)果集和流之間存在一個(gè)層次關(guān)系。該連接、以及語(yǔ)句、結(jié)果集和流可由它們自己的對(duì)象來(lái)各自表示,這些對(duì)象可以被組織成一個(gè)層次樹來(lái)反映它們之間的關(guān)系。例如,在層次樹中,連接對(duì)象是最上層的對(duì)象,語(yǔ)句對(duì)象直接在連接對(duì)象的下面,結(jié)構(gòu)集對(duì)象直接在語(yǔ)句對(duì)象的下面,等等。除了其它內(nèi)存,執(zhí)行與這些對(duì)象相關(guān)聯(lián)的方法或執(zhí)行與這些對(duì)象相關(guān)的計(jì)算需要使用內(nèi)存。因此,內(nèi)存與層次樹(在下文中被稱作為“內(nèi)存管理樹”)中的每一個(gè)對(duì)象相關(guān)聯(lián)。
特定的對(duì)象和處于該對(duì)象下層的對(duì)象組成了層次樹的子樹。例如,一個(gè)特定的語(yǔ)句對(duì)象和處于該特定語(yǔ)句對(duì)象下層所有的對(duì)象,例如結(jié)果集對(duì)象和流對(duì)象,組成了層次樹的一個(gè)子樹。子樹和與子樹中對(duì)象相關(guān)聯(lián)的內(nèi)存組成了內(nèi)存管理子樹。當(dāng)一個(gè)特定的對(duì)象不再需要時(shí),該內(nèi)存管理子樹,包括該特定對(duì)象、處于該特定對(duì)象下層的對(duì)象(在下文中被稱作該特定對(duì)象的“后代”)、以及與這些對(duì)象相關(guān)聯(lián)的內(nèi)存被釋放。例如,一旦具有語(yǔ)句對(duì)象的應(yīng)用程序被結(jié)束,該語(yǔ)句對(duì)象和所有語(yǔ)句對(duì)象的后代(例如,結(jié)果集對(duì)象和流對(duì)象)被釋放。和這些對(duì)象相關(guān)聯(lián)的內(nèi)存也被釋放。為了實(shí)現(xiàn)這個(gè),應(yīng)用程序必須跟蹤對(duì)象間的關(guān)系以及與之相關(guān)的內(nèi)存。內(nèi)存管理子樹的釋放需要以這樣一種方式來(lái)完成,層次樹中的其它對(duì)象和與它們相關(guān)的內(nèi)存不被釋放。例如,如果以特定語(yǔ)句為開始的子樹被釋放,與這個(gè)特定子樹相關(guān)聯(lián)的連接以及其它與該連接相關(guān)聯(lián)的語(yǔ)句應(yīng)該不受影響。
因此可見,不僅需要為應(yīng)用程序提供唯一的內(nèi)存管理代碼,還需要這個(gè)內(nèi)存管理代碼以這種方式提供,它被應(yīng)用程序中使用的所有類的實(shí)例對(duì)象所共享。進(jìn)一步可見,需要以一種對(duì)應(yīng)用程序透明的方式跟蹤一個(gè)層次樹中一組對(duì)象之間的關(guān)系以及與這些對(duì)象相關(guān)聯(lián)的內(nèi)存。這樣做時(shí),應(yīng)用程序可以對(duì)層次樹中的一個(gè)特定對(duì)象發(fā)布釋放,導(dǎo)致以該特定對(duì)象開始的內(nèi)存管理子樹的釋放。
發(fā)明內(nèi)容
本發(fā)明描述了一種為對(duì)象提供內(nèi)存管理的技術(shù)。具體地,描述了一種用來(lái)為不同的類的實(shí)例對(duì)象提供通用內(nèi)存管理代碼以及釋放內(nèi)存管理樹中以特定對(duì)象開始的內(nèi)存管理子樹的技術(shù)。
就為對(duì)象提供通用內(nèi)存管理而論,本發(fā)明使用了一個(gè)模板(在下文中被稱作為內(nèi)存管理模板)以提供通用預(yù)處理器內(nèi)存管理代碼。在編譯過(guò)程中,定義內(nèi)存管理接口的抽象類被傳遞到該內(nèi)存模板中用來(lái)建立一個(gè)“專用模板”。這個(gè)專用模板被用來(lái)將另一個(gè)類作為子類(在下文中被稱作“專用模板子類”)。該專用模板子類包括內(nèi)存管理可執(zhí)行代碼,它是在編譯時(shí)由通用預(yù)處理器內(nèi)存管理代碼產(chǎn)生的。根據(jù)一個(gè)實(shí)施例,專用模板子類為抽象類中的接口提供實(shí)現(xiàn)。當(dāng)專用模板子類的實(shí)例對(duì)象的一個(gè)內(nèi)存管理運(yùn)算符,例如新建或刪除,被調(diào)用時(shí),該專用模板里的內(nèi)存管理可執(zhí)行代碼被執(zhí)行。
例如,一個(gè)抽象類A_Abs提供接口,模板MM<T>提供通用預(yù)處理器內(nèi)存管理代碼,該代碼通過(guò)重載新建和刪除運(yùn)算符為通用內(nèi)存管理提供接口和實(shí)現(xiàn)。當(dāng)A_Abs被傳遞到模板MM<T>的類屬參數(shù)“T”時(shí),專用模板MM<A_Abs>被創(chuàng)建。在編譯預(yù)處理器的階段,類屬參數(shù)T被專用參數(shù)A_Abs代替用來(lái)在專用模板MM<A_Abs>中生產(chǎn)可執(zhí)行代碼。MM<A_Abs>被用來(lái)產(chǎn)生子類A_STS,它是一個(gè)專用模板子類。當(dāng)類A_STS的一個(gè)實(shí)例對(duì)象的新建或刪除運(yùn)算符被調(diào)用時(shí),MM<A_Abs>中的新建或刪除運(yùn)算符被執(zhí)行,而不是計(jì)算機(jī)語(yǔ)言提供的新建或刪除運(yùn)算符。
關(guān)于釋放內(nèi)存管理子樹,內(nèi)存與一個(gè)層次樹中的每個(gè)對(duì)象相聯(lián)系。內(nèi)存的數(shù)據(jù)被保存,它反映了對(duì)象之間的層次樹關(guān)系。這樣做,可通過(guò)單個(gè)的指令,例如析構(gòu)函數(shù),來(lái)釋放子樹和相關(guān)聯(lián)的內(nèi)存,而不需要應(yīng)用程序來(lái)跟蹤對(duì)象間的關(guān)系以及與對(duì)象相關(guān)聯(lián)的內(nèi)存。
下面通過(guò)附圖中的例子來(lái)說(shuō)明本發(fā)明,附圖中的例子并不用于對(duì)本發(fā)明進(jìn)行限制,圖中相似的參考數(shù)字代表類似的元素,其中圖1是三個(gè)類層次的方框圖,根據(jù)本發(fā)明的一個(gè)實(shí)施例,該層次使用一個(gè)內(nèi)存管理模板來(lái)為不同類的實(shí)例對(duì)象提供通用的內(nèi)存管理代碼;圖2是描述一個(gè)內(nèi)存管理模板的方框圖,根據(jù)本發(fā)明的一個(gè)實(shí)施例,該內(nèi)存管理模板提供通用的預(yù)處理器內(nèi)存管理代碼;
圖3是描述抽象類的一個(gè)方框圖,根據(jù)本發(fā)明的一個(gè)實(shí)施例,該抽象類作為一個(gè)專用類型被傳遞到內(nèi)存管理模板中以提供專用模板;圖4是根據(jù)本發(fā)明的一個(gè)實(shí)施例來(lái)描述專用模板子類定義的方框圖;圖5A和圖5B是根據(jù)本發(fā)明的一個(gè)實(shí)施例描述實(shí)現(xiàn)這些專用模板定義的方法的方框圖。
圖6是根據(jù)本發(fā)明的一個(gè)實(shí)施例描述一個(gè)使用通用內(nèi)存管理來(lái)創(chuàng)建類的應(yīng)用程序的方框圖。
圖7是用來(lái)描述一組對(duì)象的方框圖,根據(jù)本發(fā)明的一個(gè)實(shí)施例,該組對(duì)象之間具有層次樹的關(guān)系;圖8是根據(jù)本發(fā)明的一個(gè)實(shí)施例,描述與一組對(duì)象中各個(gè)對(duì)象相關(guān)聯(lián)的內(nèi)存塊的方框圖;圖9、10A和10B是描述用來(lái)創(chuàng)建對(duì)象的類的方框圖,根據(jù)本發(fā)明的一個(gè)實(shí)施例,這些對(duì)象具有一個(gè)層次樹的關(guān)系以及與這些對(duì)象相關(guān)聯(lián)的內(nèi)存;圖11是描述被用于創(chuàng)建對(duì)象的程序的方框圖,根據(jù)本發(fā)明的一個(gè)實(shí)施例,該程序利用圖9、10A和10B描述的類來(lái)創(chuàng)建對(duì)象;以及圖12是一個(gè)用來(lái)實(shí)現(xiàn)本發(fā)明一個(gè)實(shí)施例的計(jì)算機(jī)系統(tǒng)。
具體實(shí)施例方式
本發(fā)明提供了一種用來(lái)為對(duì)象提供通用內(nèi)存管理代碼的方法。在下面的說(shuō)明書中,為了解釋說(shuō)明的目的,闡明了許多詳細(xì)的細(xì)節(jié)以提供對(duì)本發(fā)明徹底的理解。但是,顯然沒(méi)有這些詳細(xì)的細(xì)節(jié),本發(fā)明也可以實(shí)行。在其它的實(shí)施例中,眾所周知的結(jié)構(gòu)和裝置以方框圖的形式顯示以避免對(duì)本發(fā)明造成不必要的模糊。
在通用內(nèi)存管理中使用的類層次概述圖1是三個(gè)類層次的方框圖,根據(jù)本發(fā)明的一個(gè)實(shí)施例,該層次使用一個(gè)內(nèi)存管理模板來(lái)為不同類的實(shí)例對(duì)象提供通用的內(nèi)存管理代碼。三個(gè)層次中所有的類,類層次1、類層次2和類層次3,以一種形式或另一種形式提供了代碼。提供代碼涉及為隨后的編譯和運(yùn)行創(chuàng)建代碼的處理或動(dòng)作。例如,一個(gè)程序員通過(guò)以類的形式輸入源代碼到一個(gè)文件中來(lái)提供代碼,該文件可通過(guò)編譯器進(jìn)行編譯來(lái)訪問(wèn)。提供代碼還涉及將代碼存儲(chǔ)在庫(kù)中用于以后其它需要查閱庫(kù)的應(yīng)用程序的編譯。
這三個(gè)類層次被用來(lái)創(chuàng)建三個(gè)專用模板子類的實(shí)例對(duì)象,A_STS:MM<A_Abs>130,B_STS:MM<B_Abs>160和C_STS:MM<C_Abs>190(這三個(gè)專用模板子類的符號(hào)按如下的順序1)類的名稱,2)冒號(hào),以及3)被用來(lái)產(chǎn)生子類的專用模板的名稱。例如在A_STS:MM<A_Abs>130中,A_STS是用來(lái)創(chuàng)建一個(gè)對(duì)象的類的名稱,而MM<A_Abs>130是一個(gè)專用模板子類的名字,如下文中將更加詳細(xì)描述的那樣。這些對(duì)象包括內(nèi)存管理可執(zhí)行代碼,它們都是由一個(gè)內(nèi)存管理模板中的通用預(yù)處理器內(nèi)存管理代碼生成,如將在下面詳細(xì)地描述的那樣。
在每個(gè)類層次的最上層是一個(gè)抽象類A_Abs 110、B_Abs 140和C_Abs 170,這些抽象類為方法(131,132,161,162,191)提供接口(113,114,143,144,173),這些方法在專用模板子類(130,160,190)中實(shí)現(xiàn)。通過(guò)定義,一個(gè)抽象類為方法和/或運(yùn)算符規(guī)定接口,但是并不為該方法和/或運(yùn)算符提供實(shí)現(xiàn)。
為新建和刪除運(yùn)算符提供的通用預(yù)處理器內(nèi)存管理代碼在一個(gè)內(nèi)存管理模板中。內(nèi)存管理模板被記作MM<T>,其中T是一個(gè)類屬參數(shù),用來(lái)傳遞一個(gè)專用類型到內(nèi)存管理模板中。在編譯預(yù)處理器過(guò)程中,(1)類屬類型參數(shù)T被傳遞到內(nèi)存管理模板中的專用類型代替(例如,A_Abs,B_Abs,C_Abs),(2)內(nèi)存管理模板被復(fù)制,(3)利用被傳遞到類屬參數(shù)T以產(chǎn)生專用模板(120,150,180)的專用類型,將內(nèi)存管理模板的復(fù)制專用化。例如,在專用模板MM<A_Abs>120中,抽象類A_Abs 110是被傳遞到類屬參數(shù)T的專用類型。
因此,每一個(gè)專用模板(120,150和180)有它自己的內(nèi)存管理執(zhí)行代碼(121,122,151,152,181,182),它們?cè)从趦?nèi)存管理模板中的內(nèi)存管理預(yù)處理器代碼的一個(gè)拷貝。例如,新建121和刪除122是MM<A_Abs>120自己的內(nèi)存管理可執(zhí)行代碼。同樣地,專用模板(120,150,180)有它們自己數(shù)據(jù)成員地拷貝,例如hndlp_(123,153,和183),用來(lái)存儲(chǔ)數(shù)據(jù)。
雖然MM<A_Abs>120、MM<B_Abs>150和MM<C_Abs>180每個(gè)都生成單獨(dú)的專用模板用來(lái)使另一個(gè)類(130,160,190)成為它的子類,但是僅僅存在一個(gè)內(nèi)存管理預(yù)處理器代碼拷貝。因此僅僅有一個(gè)內(nèi)存管理預(yù)處理器代碼需要維護(hù)和升級(jí)。這個(gè)內(nèi)存管理預(yù)處理器代碼拷貝在內(nèi)存管理模板中,將會(huì)被詳細(xì)討論。
根據(jù)一個(gè)實(shí)施例,只提供一個(gè)專用模板和一個(gè)抽象類。例如,假設(shè)一個(gè)類屬內(nèi)存管理抽象類MM_Abs是唯一被用來(lái)提供一個(gè)類屬接口的,如用來(lái)創(chuàng)建任一類型對(duì)象的一個(gè)接口,并且在類層次1、2和3中被用作抽象類。那么專用模板120、150、180將都是MM<MM_Abs>,且專用模板子類將會(huì)是A_STS:MM<MM_Abs>130、B_STS:MM<MM_Abs>160和C_STS:MM<MM_Abs>190。
專用模板(120,150,180)被用來(lái)創(chuàng)建專用模板子類(130,160,190)。根據(jù)一個(gè)實(shí)施例,專用模板子類(130,160,190)在方法(131,132,161,162,191)中實(shí)現(xiàn)抽象子類(110,140,170)的非內(nèi)存管理接口(113,114,143,144,173)。例如,MM<MM_Abs>120被用來(lái)使A_STS:MM<MM_Abs>130成為它的子類。非內(nèi)存管理接口113和114在方法131和132中被實(shí)現(xiàn),該方法將會(huì)被詳細(xì)討論。根據(jù)一個(gè)實(shí)施例,一個(gè)專用模板子類(130,160或190)提供一個(gè)工廠方法(131或161)來(lái)創(chuàng)建另一個(gè)專用模板子類的實(shí)例對(duì)象。例如,A_STS:MM<A_Abs>130中的create_B_STS 131是一個(gè)創(chuàng)建類B_STS:MM<B_Abs>160的實(shí)例對(duì)象的工廠方法。如將要看到的,工廠方法提供一個(gè)最小化指針訪問(wèn)內(nèi)存次數(shù)的機(jī)制,例如一個(gè)通用堆(common heap),該內(nèi)存在調(diào)用方法時(shí)作為一個(gè)參數(shù)被傳遞。
在整個(gè)該申請(qǐng)中,不同的運(yùn)算符和動(dòng)作被描述為在代碼和指令中被執(zhí)行或在代碼和指令中發(fā)生。然而,這是一種方便的方式表示從那段代碼指令開始或從那里代碼被編譯,當(dāng)被執(zhí)行后,引起運(yùn)算符和動(dòng)作被執(zhí)行。
內(nèi)存管理模板圖2是一個(gè)描述內(nèi)存管理模板的方框圖,根據(jù)本發(fā)明的一個(gè)實(shí)施例,該模板提供通用預(yù)處理器內(nèi)存管理代碼。內(nèi)存管理模板,如圖2中所描述的,提供通用預(yù)處理器代碼,該預(yù)處理器代碼通過(guò)重載新建和刪除運(yùn)算符為通用內(nèi)存管理提供接口(204,205)和實(shí)現(xiàn)(230,240)。類和模板代表性地有兩種選擇(1)一個(gè)定義部分用來(lái)規(guī)定方法和/或運(yùn)算符的接口,和(2)實(shí)現(xiàn)部分用來(lái)規(guī)定方法和/或運(yùn)算符的代碼。MM模板200描述了內(nèi)存管理模板的定義。在MM模板200的公共部分,提供三個(gè)接口(202,204,205)。一個(gè)接口202相應(yīng)于MM模板的構(gòu)造器210。其它兩個(gè)接口(新建204和刪除205)相應(yīng)于通用內(nèi)存管理實(shí)現(xiàn)(230和240)。在保護(hù)成員部分,提供一個(gè)數(shù)據(jù)成員hndlp_206。數(shù)據(jù)成員hndlp_206被用作一個(gè)堆或子堆的指針,該堆被通用預(yù)處理器代碼(230,240)所使用。“T”(201,211,231,241)是內(nèi)存管理模板的類屬類型參數(shù),被用來(lái)創(chuàng)建專用模板MM<ConnectionAbs>、MM<Statement Abs>和MM<ResultsetAbs>,在下文中將會(huì)被詳細(xì)描述。
根據(jù)一個(gè)實(shí)施例,在MM模板的新建運(yùn)算符230和MM模板的刪除運(yùn)算符240中提供通用預(yù)處理器內(nèi)存管理代碼。MM模板的新建運(yùn)算符230為運(yùn)算符新建接口204提供實(shí)現(xiàn)代碼。如果沒(méi)有堆存在,該新建運(yùn)算符230使用代碼實(shí)現(xiàn)語(yǔ)言的默認(rèn)內(nèi)存管理以在指令232中分配內(nèi)存。如果存在一個(gè)堆,專用處理在指令233中發(fā)生。該專用處理可能需要細(xì)分該堆,運(yùn)行專用實(shí)現(xiàn)指令,返回指向一個(gè)存在地堆的指針,或一些其它種類的專用處理。MM模板的刪除運(yùn)算符240是為運(yùn)算符刪除接口205提供實(shí)現(xiàn)代碼。如果堆存在,專用處理在指令242發(fā)生。這個(gè)專用處理可能需要釋放該堆,釋放該堆的一個(gè)細(xì)分或一些其它種類的專用處理。
抽象類圖3是用來(lái)描述抽象類的方框圖,根據(jù)本發(fā)明的一個(gè)實(shí)施例,該抽象類作為一個(gè)專用類型被傳遞到內(nèi)存管理模板中以提供專用模板。ConnectionAbs類300、StatementAbs類310和ResultAbs類320是抽象類的實(shí)例,它們用于(1)提供在專用模板子類中實(shí)現(xiàn)的接口和(2)作為專用類型被傳遞到MM模板200。根據(jù)一個(gè)實(shí)施例,在抽象類(300,310,320)中提供接口(301,311)。例如,在專用模板子類方法(510,530)中提供這些接口(301,311)的實(shí)現(xiàn)。根據(jù)一個(gè)實(shí)施例,在抽象類中的接口(301,311)和在專用模板子類中相應(yīng)的實(shí)現(xiàn)(510,530)是為了提供工廠方法。
專用模板子類圖4是根據(jù)本發(fā)明的一個(gè)實(shí)施例來(lái)描述專用模板子類定義的方框圖。圖5A和圖5B是根據(jù)本發(fā)明的一個(gè)實(shí)施例來(lái)描述實(shí)現(xiàn)這些專用模板定義的方法的方框圖。在這個(gè)例子中,描述了三個(gè)專用模板子類定義(400,410,420)。這些專用模板子類被用來(lái)實(shí)例化訪問(wèn)通用內(nèi)存管理代碼的對(duì)象(注意代碼段401、411和421,類400、410和420是專用模板的子類)。例如,如果對(duì)象A是ConnectionSTS類400的一個(gè)實(shí)例,對(duì)象B是StatementSTS類410的一個(gè)實(shí)例,以及對(duì)象C是ResultsetSTS類420的一個(gè)實(shí)例,那么對(duì)象A、B和C具有可執(zhí)行代碼,這些代碼都是在編譯時(shí)由內(nèi)存管理模板(200,210,230,240)中的同一個(gè)通用預(yù)處理器內(nèi)存管理代碼生成的。
每個(gè)專用模板子類定義均具有一個(gè)構(gòu)造器接口(402,412,422)。這些構(gòu)造器接口各自的實(shí)現(xiàn)是ConnectionSTS的構(gòu)造器500,StatementSTS的構(gòu)造器520和ResultsetSTS的構(gòu)造器540。構(gòu)造器被用來(lái)創(chuàng)建構(gòu)造器所屬的類的實(shí)例對(duì)象。構(gòu)造器可能提供的一個(gè)函數(shù)是一個(gè)對(duì)象數(shù)據(jù)程序的初始化。例如,構(gòu)造器500、520和540在指令501、521和541中初始化數(shù)據(jù)成員hndlp_206,如將要被更加詳細(xì)描述的那樣。在一個(gè)可供選擇的實(shí)施例中,當(dāng)MM模板的構(gòu)造器210在一個(gè)對(duì)象初始化過(guò)程中被調(diào)用時(shí),數(shù)據(jù)成員hndlp_206在代碼段212被初始化,如將要被更加詳細(xì)描述的那樣。構(gòu)造器500和520各自在指令502和522中初始化數(shù)據(jù)成員405和415。
根據(jù)面向?qū)ο蟮木幊?,如果一個(gè)對(duì)象是一個(gè)子類的實(shí)例,那么在該對(duì)象的實(shí)例化處理過(guò)程中,構(gòu)成成員以它們繼承層次的順序被調(diào)用。例如,如果MM<ConnectionAbs>的一個(gè)子類ConnectionSTS類400被用來(lái)創(chuàng)建一個(gè)對(duì)象A,那么ConnectionSTS的構(gòu)造器500在超類的構(gòu)造器MM<ConnectionAbs>::MM之后被調(diào)用,該超類的構(gòu)造器是MM模板的構(gòu)造器210的一個(gè)專用化形式。
根據(jù)一個(gè)實(shí)施例,專用模板子類提供在抽象類中的非內(nèi)存管理接口的實(shí)現(xiàn),而MM模板200提供內(nèi)存管理接口及其實(shí)現(xiàn)(230,240)。例如,專用模板子類A_STS:MM<A_Abs>130提供非內(nèi)存管理接口的實(shí)現(xiàn)create_B_STS 113和function_A 114,而MM<T>提供內(nèi)存管理接口的實(shí)現(xiàn)新建111和刪除112。
根據(jù)另一實(shí)施例,抽象類只被用來(lái)提供類屬接口。例如,類屬抽象類MM_Abs可提供類屬參數(shù)例如一個(gè)用來(lái)創(chuàng)建任一類型對(duì)象或執(zhí)行一個(gè)類型操作的接口,并且在內(nèi)存管理模板MM<T>中類屬參數(shù)T被MM_Abs代替以產(chǎn)生一個(gè)專用模板MM<MM_Abs>。這樣,MM_Abs將會(huì)在代碼段401,411和421被傳遞到專用模板子類。
根據(jù)一個(gè)實(shí)施例,專用模板子類提供工廠方法(403,413)用來(lái)創(chuàng)建其它專用模板子類的實(shí)例對(duì)象。例如,工廠方法createStatement 403被用來(lái)創(chuàng)建StatementSTS類410的一個(gè)實(shí)例對(duì)象,如將要被更加詳細(xì)描述的那樣。在創(chuàng)建其它專用模板子類的實(shí)例對(duì)象過(guò)程中,工廠方法實(shí)現(xiàn)(510,530)分別在代碼段511a和532a調(diào)用新建運(yùn)算符230用來(lái)為對(duì)象分配內(nèi)存,且接著分別在代碼段511b和532b為其它專用模板子類調(diào)用構(gòu)造器。例如,ConnectionSTS類400中的工廠方法createStatement 510被用來(lái)創(chuàng)建對(duì)象A,那么代碼段511a調(diào)用MM模板的新建運(yùn)算符230來(lái)為對(duì)象A分配內(nèi)存,而StatementSTS的構(gòu)造器520在代碼段511b被調(diào)用來(lái)“構(gòu)造”對(duì)象A。然后由于StatementSTS類410是MM<StatementAbs>的一個(gè)子類,MM模板構(gòu)造器210的一個(gè)專用形式MM<StatementAbs>::MM被調(diào)用。根據(jù)一個(gè)實(shí)施例,當(dāng)MM<StatementAbs>::MM被調(diào)用時(shí),hndlp_206在代碼段212被初始化。
通用內(nèi)存管理操作實(shí)例圖6是根據(jù)本發(fā)明的一個(gè)實(shí)施例,描述一個(gè)使用通用內(nèi)存管理來(lái)創(chuàng)建類的應(yīng)用程序的方框圖。應(yīng)用程序600在一系列指令(602,603和604)中創(chuàng)建這樣三個(gè)對(duì)象,ConnectionSTS對(duì)象、StatementSTS對(duì)象和ResultsetSTS對(duì)象。為了簡(jiǎn)化,在指令602中創(chuàng)建ConnectionSTS對(duì)象conn。在指令603中調(diào)用conn中的工廠方法,用來(lái)創(chuàng)建一個(gè)StatementSTS對(duì)象stmt。另一個(gè)在stmt中的工廠方法在指令604中被調(diào)用,用來(lái)創(chuàng)建一個(gè)ResultsetSTS對(duì)象rs。所有三個(gè)對(duì)象都包含內(nèi)存管理可執(zhí)行代碼,該代碼由通用預(yù)處理器內(nèi)存管理代碼以及指向一個(gè)通用堆的指針生成,如將要被更加詳細(xì)描述的那樣。
內(nèi)存管理可執(zhí)行代碼源于通用預(yù)處理器代碼。例如,對(duì)象conn包含內(nèi)存管理可執(zhí)行代碼用來(lái)重載MM<ConnectionAbs>::operators新建和刪除,對(duì)象stmt包含內(nèi)存管理可執(zhí)行代碼用來(lái)重載MM<StatementAbs>::operators新建和刪除,對(duì)象rs包含內(nèi)存管理可執(zhí)行代碼用來(lái)重載MM<ResultsetAbs>::operators新建和刪除。所有這些內(nèi)存管理可執(zhí)行代碼源于通用預(yù)處理器內(nèi)存管理代碼,如圖2中描述的MM模板定義的那樣。
根據(jù)一個(gè)實(shí)施例,如將要被詳細(xì)討論的那樣,一個(gè)通用堆被對(duì)象所共享。根據(jù)一個(gè)實(shí)施例,通用堆通過(guò)傳遞一個(gè)指針到創(chuàng)建對(duì)象的一系列指令(602,603,604)中的第一條指令中被共享。例如,指針pH1在指令601被初始化給一個(gè)通用堆。根據(jù)一個(gè)實(shí)施例,如將要被詳細(xì)討論的那樣,通用堆在沒(méi)有傳遞一個(gè)指針到一系列指令的每個(gè)指令中被對(duì)象所共享。根據(jù)另一個(gè)實(shí)施例,通用堆通過(guò)傳遞一個(gè)指針到一系列指令的每個(gè)指令中被對(duì)象所共享。如果pH1在指令602,603和604的調(diào)用中出現(xiàn),那么將會(huì)是這種情形。
在指令601中,應(yīng)用程序600為一個(gè)通用堆初始化一個(gè)指針。在指令602中,應(yīng)用程序600調(diào)用一個(gè)全局程序createConnection 610用來(lái)(1)創(chuàng)建一個(gè)ConnectionSTS對(duì)象conn,(2)返回一個(gè)指針給conn對(duì)象,和(3)在新創(chuàng)建的conn對(duì)象中保存這個(gè)通用堆的指針。
例如,全局程序createConnection 610在指令611中創(chuàng)建conn對(duì)象。指令611有兩個(gè)部分在代碼段611a一個(gè)對(duì)MM<ConnectionSTS>::新建的調(diào)用和在代碼段611b對(duì)ConnectionSTS的構(gòu)造器500的調(diào)用。MM<ConnectionSTS>::新建是MM模板的新建運(yùn)算符230的一個(gè)專用形式,它在指令232中為conn對(duì)象分配內(nèi)存并且返回一個(gè)指針給conn。ConnectionSTS的構(gòu)造器500通過(guò)在指令501中初始化MM<ConnectionAbs>::hndlp_206以及通過(guò)在指令502中有選擇地初始化其它數(shù)據(jù)成員來(lái)“構(gòu)造”conn。因?yàn)镃onnectionSTS類400是MM<ConnectionAbs>401的一個(gè)子類,MM模板的構(gòu)造器210的一個(gè)專用形式被調(diào)用。
在指令603和604中,對(duì)象中的工廠方法被用來(lái)(1)創(chuàng)建其它對(duì)象,和(2)傳遞通用堆的指針給每個(gè)其它對(duì)象。為了創(chuàng)建對(duì)象stmt和rs,工廠方法createStatement方法510和execQuery方法540分別在指令603和604中被調(diào)用。為了傳遞一個(gè)指向通用堆的指針,工廠方法createStatement和execQuery將該指針從一個(gè)對(duì)象傳遞到下一個(gè)被創(chuàng)建的對(duì)象。例如,對(duì)象conn在指令602中被創(chuàng)建且在指令603中被用來(lái)傳遞一個(gè)通用堆指針給對(duì)象stmt。這通過(guò)在指令602中傳遞通用堆成員的指針pH1給createConnection 610來(lái)實(shí)現(xiàn)。代碼段611a引起對(duì)MM<ConnectionAbs>::新建的調(diào)用。代碼段611b引起對(duì)ConnectionSTS的構(gòu)造器500的調(diào)用,其中通用堆的指針也被存儲(chǔ)在對(duì)象conn中。ConnectionSTS的構(gòu)造器500在指令501中存儲(chǔ)通用的堆指針到MM<ConnectionAbs>::hndlp_中。然后,當(dāng)conn中的工廠方法createStatement被用來(lái)創(chuàng)建對(duì)象stmt時(shí),被存儲(chǔ)的通用堆指針在指令603中從對(duì)象conn被傳遞給對(duì)象stmt。例如,在代碼段511a中,作為hndlp_206的一個(gè)專用形式的MM<ConnectionAbs>::hndlp_被傳遞給為對(duì)象stmt分配內(nèi)存的新建運(yùn)算符。在指令604中,關(guān)于對(duì)象rs有相似的處理。
對(duì)象的層次樹圖7是用來(lái)描述一組對(duì)象的方框圖,根據(jù)本發(fā)明的一個(gè)實(shí)施例,該組對(duì)象之間具有層次樹的關(guān)系(在下文中被稱作為“層次樹”)。例如,對(duì)任意給定的數(shù)據(jù)庫(kù)連接,執(zhí)行一個(gè)或更多包含語(yǔ)句的查詢。返回響應(yīng)查詢的結(jié)果集。從結(jié)果集中獲取流以協(xié)調(diào)讀取那些不能在一個(gè)函數(shù)調(diào)用中讀取的大數(shù)據(jù)對(duì)象,例如Binary Large Objects。因此,在數(shù)據(jù)庫(kù)連接和相關(guān)語(yǔ)句、結(jié)果集以及流之間存在一個(gè)層次關(guān)系。連接和相關(guān)語(yǔ)句、結(jié)果集以及流可各自被一個(gè)對(duì)象所表示,且對(duì)象可以被組織成一個(gè)層次樹來(lái)反映對(duì)象之間的關(guān)系。
例如,Conn_1是一個(gè)連接對(duì)象。Stmt_1、Stmt_2和Stmt_3是語(yǔ)句對(duì)象,用來(lái)表示對(duì)該連接進(jìn)行查詢時(shí)所使用的語(yǔ)句。RS_1和RS_2是結(jié)果集對(duì)象,用來(lái)表示返回的結(jié)果集以響應(yīng)Stmt_1的查詢。RS_3和RS_4也是結(jié)果集對(duì)象,用來(lái)表示返回的結(jié)果集以響應(yīng)Stmt_3的查詢。流Stream_1和Stream_2分別從結(jié)果集RS_1和RS_4獲得。除了其它內(nèi)存,被用于執(zhí)行方法或執(zhí)行計(jì)算時(shí)使用的內(nèi)存(H0,H1,H2,H3,H11,H12,H31,H32,H111,H321)與層次樹中的每個(gè)對(duì)象相關(guān)聯(lián)。例如,內(nèi)存H0與對(duì)象Conn_1相關(guān)聯(lián),內(nèi)存H1與對(duì)象Stmt_1相關(guān)聯(lián),等等。
與層次對(duì)象樹相關(guān)聯(lián)的內(nèi)存圖8是一個(gè)根據(jù)本發(fā)明的一個(gè)實(shí)施例來(lái)描述與一組對(duì)象中每個(gè)對(duì)象相關(guān)聯(lián)的內(nèi)存塊的方框圖。組織這些內(nèi)存塊(在下文中稱之為層次內(nèi)存樹)以反映對(duì)象之間的層次樹關(guān)系。根據(jù)一個(gè)實(shí)施例,圖8描繪了與圖7中描繪的對(duì)象組相關(guān)聯(lián)的層次內(nèi)存樹。例如,H0是一個(gè)與對(duì)象Conn_1相關(guān)聯(lián)的內(nèi)存塊;H1、H2和H3是與語(yǔ)句對(duì)象Stmt_1、Stmt_2和Stmt_3分別相關(guān)聯(lián)的內(nèi)存塊;H11、H12、H31和H32是與結(jié)果集對(duì)象RS_1、RS_2、RS_3和RS_4分別相關(guān)聯(lián)的內(nèi)存塊;H111和H321是與流對(duì)象Stream_1和Stream_2分別相關(guān)聯(lián)的內(nèi)存塊。
根據(jù)一個(gè)實(shí)施例,堆是一個(gè)與層次樹中的最頂層對(duì)象相關(guān)聯(lián)的內(nèi)存塊,該堆的子堆是與剩余對(duì)象相關(guān)聯(lián)的內(nèi)存塊。例如,在圖7中,與最頂層對(duì)象Conn_1相關(guān)聯(lián)的H0是一個(gè)堆,與其它對(duì)象(H1、H2、H3等)相關(guān)聯(lián)的內(nèi)存是H0的子堆。
層次數(shù)據(jù)被保存用來(lái)確定層次內(nèi)存樹的層次結(jié)構(gòu),且以這樣一種方式來(lái)保存,層次內(nèi)存樹反映層次樹中對(duì)象組之間的層次結(jié)構(gòu)。除了其它類型,該數(shù)據(jù)可以是指針和引用,它被保存在(1)對(duì)象組數(shù)據(jù)成員中,(2)與對(duì)象組相關(guān)聯(lián)的內(nèi)存中,或(3)在一個(gè)或更多表中。
通過(guò)維持反映對(duì)象組層次關(guān)系的內(nèi)存的層次數(shù)據(jù),一個(gè)內(nèi)存子樹可以通過(guò)單個(gè)的請(qǐng)求被釋放,例如一個(gè)對(duì)象析構(gòu)器或析構(gòu)函數(shù),而不會(huì)影響體系結(jié)構(gòu)樹中的其它對(duì)象或與體系結(jié)構(gòu)樹中其它對(duì)象相關(guān)聯(lián)的內(nèi)存。
根據(jù)一個(gè)實(shí)施例,這個(gè)層次數(shù)據(jù)是一對(duì)與堆和層次內(nèi)存樹中的各個(gè)子堆關(guān)聯(lián)的兄弟指針和子指針。堆和各個(gè)子堆指向一個(gè)它自己的子和它自己的兄弟的列表。例如,與Conn_1相關(guān)聯(lián)的堆H0的子是子堆H1、H2和H3。子堆H1的兄弟是子堆H2和H3。
使用單個(gè)請(qǐng)求釋放與內(nèi)存子樹相關(guān)聯(lián)的內(nèi)存圖9、10A和10B是用來(lái)描述用來(lái)創(chuàng)建對(duì)象的類的方框圖,根據(jù)本發(fā)明的一個(gè)實(shí)施例,這些對(duì)象具有層次樹的關(guān)系以及與這些對(duì)象相關(guān)聯(lián)的內(nèi)存。圖9是描述Connection類、Statement類和Resultset類的定義的方框圖。圖10A和10B是描述與這些類相關(guān)聯(lián)的方法的方框圖。在這個(gè)例子中,這些類被用來(lái)創(chuàng)建連接對(duì)象、語(yǔ)句對(duì)象和結(jié)果集對(duì)象。圖11是描述被用于創(chuàng)建對(duì)象的程序的方框圖,根據(jù)本發(fā)明的一個(gè)實(shí)施例,該程序利用圖9、10A和10B描述的類來(lái)創(chuàng)建對(duì)象。
根據(jù)一個(gè)實(shí)施例,用單個(gè)請(qǐng)求釋放與內(nèi)存子樹相關(guān)聯(lián)的內(nèi)存結(jié)合通用內(nèi)存管理被執(zhí)行。這樣,Connection類900、Statement類910和Resultset類920將是專用模板的子類。例如,當(dāng)Connection類900被用來(lái)創(chuàng)建對(duì)象A時(shí),調(diào)用新建運(yùn)算符230。同樣當(dāng)對(duì)象A被銷毀時(shí),調(diào)用Connection類900中析構(gòu)器(沒(méi)有顯示),依次調(diào)用刪除運(yùn)算符240。然后刪除運(yùn)算符240或刪除運(yùn)算符240調(diào)用的一個(gè)函數(shù)遍歷層次數(shù)據(jù)來(lái)釋放與對(duì)象A相關(guān)聯(lián)的內(nèi)存和與對(duì)象A相關(guān)聯(lián)的子樹。例如,如果圖7中描述的析構(gòu)器Stmt_1被應(yīng)用程序調(diào)用,該析構(gòu)器可使用圖8中描述的子指針和兄弟指針來(lái)確定子堆H1、H11、H12和H111應(yīng)該被釋放。
根據(jù)另一個(gè)實(shí)施例,執(zhí)行單個(gè)的請(qǐng)求來(lái)釋放與一個(gè)內(nèi)存子樹相關(guān)聯(lián)的內(nèi)存,而不用通用內(nèi)存管理代碼。例如,Connection類900、Statement類910和Resultset類920不是專用模板的子類。
內(nèi)存指針(906,916,923)與各個(gè)用來(lái)創(chuàng)建層次樹對(duì)象的類(900,910,920)相關(guān)聯(lián)。例如,Connection類900、Statement類910和Resultset類920都有指針(906,916,923)指向一個(gè)堆或一個(gè)子堆。構(gòu)造器(1000,1020,1040)使用初始指令(1001,1021,1041)來(lái)初始化指針(906,916,923)。例如,Connection的構(gòu)造器1000、Statement的構(gòu)造器1020和Resultset的構(gòu)造器1040在初始化指令1001、1020和1041中初始化它們各自的內(nèi)存指針指向堆或子堆。工廠方法(1010,1030)不僅被用來(lái)創(chuàng)建其它類型類的新對(duì)象(1011、1032),還維持反映對(duì)象組層次關(guān)系的內(nèi)存的層次數(shù)據(jù)(907,908,917,918,924,925)。例如,Connection的createStatement方法1010(1)在指令1011中創(chuàng)建一個(gè)新建連接對(duì)象堆的子堆(906),(2)在指令1012中創(chuàng)建一個(gè)語(yǔ)句對(duì)象且將新創(chuàng)建的子堆與該語(yǔ)句對(duì)象相關(guān)聯(lián),和(3)在指令1013中以子指針和兄弟指針(907和908)形式為子堆保存層次數(shù)據(jù),使得子堆反映對(duì)象組之間的層次關(guān)系。
通過(guò)在工廠方法中創(chuàng)建對(duì)象和保存層次數(shù)據(jù)在與這些對(duì)象相關(guān)聯(lián)的內(nèi)存中或作為對(duì)象自己的數(shù)據(jù)成員,一個(gè)子樹和與它相關(guān)聯(lián)的內(nèi)存可以用單個(gè)的請(qǐng)求被釋放。保存層次數(shù)據(jù)在內(nèi)存中的例子已經(jīng)在這里被描述。假設(shè)層次數(shù)據(jù)作為對(duì)象中的數(shù)據(jù)成員被保存,一個(gè)函數(shù)可使用對(duì)象Stmt_1、RS_1、RS_2和Stream_1中的數(shù)據(jù)成員來(lái)確定需要被釋放的子堆H1、H11、H12和H111。
其它實(shí)施例根據(jù)另一個(gè)實(shí)施例,所有層次內(nèi)存樹的內(nèi)存是一個(gè)單一連續(xù)的內(nèi)存塊,它被分割成多個(gè)內(nèi)存塊與層次樹中的各個(gè)對(duì)象相關(guān)聯(lián)。指針被使用,以保存與單個(gè)對(duì)象相關(guān)聯(lián)的內(nèi)存塊之間的關(guān)系??梢允褂萌魏我阎谋4孢@些指針的方法,例如保存這些指針在單一的內(nèi)存塊自身中或保存這些指針在一個(gè)表中。
硬件概述圖12的方框圖說(shuō)明了一個(gè)實(shí)現(xiàn)本發(fā)明實(shí)施例的計(jì)算機(jī)系統(tǒng)1200。計(jì)算機(jī)系統(tǒng)1200包括總線1202或用于信息通信的其它通信裝置,以及處理器1204與總線1202相連用于信息處理。計(jì)算系統(tǒng)1200還包括主存儲(chǔ)器1206,例如隨機(jī)存取存儲(chǔ)器(RAM)或其它動(dòng)態(tài)存儲(chǔ)裝置,與總線1202相連用于儲(chǔ)存將被處理器1204執(zhí)行的信息和指令。在處理器1204進(jìn)行指令執(zhí)行過(guò)程中,主存儲(chǔ)器1206還可以被用于存儲(chǔ)臨時(shí)變量或其它中間信息。計(jì)算機(jī)系統(tǒng)1200還包括與總線1202相連的只讀存儲(chǔ)器(ROM)1208或其它靜態(tài)存儲(chǔ)裝置,用于存儲(chǔ)處理器1204的靜態(tài)信息和指令。存儲(chǔ)裝置1210,例如磁盤或光盤,與總線1202相連,用于存儲(chǔ)信息和指令。
計(jì)算機(jī)系統(tǒng)1200還可通過(guò)總線1202與顯示器1212相連,例如陰極射線管(CRT),用來(lái)顯示信息給計(jì)算機(jī)用戶。輸入裝置1214,包括文字?jǐn)?shù)字以及其它按鍵,與總線1202相連用來(lái)傳達(dá)信息和命令給處理器1204。另一種類型用戶輸入裝置是光標(biāo)控制器1216,例如鼠標(biāo)、軌跡球或光標(biāo)方向鍵,用來(lái)傳達(dá)方向信息和命令選擇給處理器1204以及用來(lái)控制顯示器1212上的光標(biāo)移動(dòng)。這個(gè)輸入裝置典型地具有兩個(gè)自由度在兩個(gè)軸上,第一個(gè)軸(例如x)和第二個(gè)軸(例如y),使得該裝置在一個(gè)平面上確定位置。
本發(fā)明涉及計(jì)算機(jī)系統(tǒng)1200的使用以實(shí)現(xiàn)這里描述的技術(shù)。根據(jù)本發(fā)明的一個(gè)實(shí)施例,這些技術(shù)通過(guò)計(jì)算機(jī)系統(tǒng)1200響應(yīng)處理器1204執(zhí)行主存儲(chǔ)器1206中的一組或更多組的單一或多個(gè)指令來(lái)完成。這樣的指令可從另一個(gè)計(jì)算機(jī)可讀介質(zhì)中,例如存儲(chǔ)裝置1210,讀取到主存儲(chǔ)器1206中。在主存儲(chǔ)器1206內(nèi)指令的執(zhí)行導(dǎo)致處理器1204完成這里所描述的處理步驟。在一個(gè)可供選擇的實(shí)施例中,硬線電路可被用來(lái)代替軟件指令或與軟件指令相結(jié)合來(lái)實(shí)現(xiàn)本發(fā)明。因此,本發(fā)明的實(shí)施例不局限于任何特殊的硬件電路和軟件組合。
這里使用的術(shù)語(yǔ)“計(jì)算機(jī)可讀介質(zhì)”指任何參與提供指令給處理器1204執(zhí)行的介質(zhì)。這樣一個(gè)介質(zhì)可以有許多種形式,包括但不局限于非易失性介質(zhì)、易失性介質(zhì)和傳輸介質(zhì)。非易失性介質(zhì)包括,例如光盤和磁盤,如存儲(chǔ)裝置1210。易失性介質(zhì)包括動(dòng)態(tài)存儲(chǔ)器,如主存儲(chǔ)器1206。傳輸介質(zhì)包括同軸電纜、銅線和光纖,包括組成總線1202的導(dǎo)線。傳輸介質(zhì)還可以是聲波和光波,例如那些在無(wú)線電波和紅外數(shù)據(jù)通信時(shí)產(chǎn)生的波。
普通形式的計(jì)算機(jī)可讀介質(zhì)包括,例如軟盤、軟碟、硬盤、磁帶或任何其它磁性介質(zhì),CD-ROM、任何其它光學(xué)介質(zhì),打孔卡片、打孔紙帶、任何其它具有孔狀圖案的物理介質(zhì),RAM、PROM以及EPROM、FLASH-EPROM,任何其它存儲(chǔ)芯片內(nèi)存盒,載波如下文所描述的,或其它任何計(jì)算機(jī)可讀的介質(zhì)。
不同形式的計(jì)算機(jī)可讀介質(zhì)可用來(lái)傳送一組或更多組的單一或多個(gè)指令到處理器1204執(zhí)行。例如,指令可能初始在一臺(tái)遠(yuǎn)程計(jì)算機(jī)的磁盤上。該遠(yuǎn)程計(jì)算機(jī)可把指令裝入到動(dòng)態(tài)內(nèi)存中然后利用調(diào)制解調(diào)器將指令送入電話線。計(jì)算機(jī)系統(tǒng)1200的本地調(diào)制解調(diào)器可以接收到電話線上的數(shù)據(jù),然后使用紅外發(fā)射機(jī)將數(shù)據(jù)變成紅外信號(hào)。紅外探測(cè)器可接收紅外信號(hào)上攜帶的數(shù)據(jù),并且適當(dāng)?shù)碾娐房蓪?shù)據(jù)放到總線1202上。總線1202傳送數(shù)據(jù)給主存儲(chǔ)器1206,處理器1204從那兒獲取并執(zhí)行指令。這些從主存儲(chǔ)器1206收到的指令在被存儲(chǔ)器1204執(zhí)行前或執(zhí)行后選擇性地被存儲(chǔ)在存儲(chǔ)裝置1210上。
計(jì)算機(jī)系統(tǒng)1200還包括通信接口1218,其連接在總線1202上。通信接口1218提供雙向數(shù)據(jù)通信,與連接在局域網(wǎng)絡(luò)1222上的網(wǎng)絡(luò)鏈路1220相連。例如,通信接口1218可以是綜合數(shù)據(jù)業(yè)務(wù)網(wǎng)(ISDN)網(wǎng)卡,或調(diào)制解調(diào)器用來(lái)提供數(shù)據(jù)通信連接到相應(yīng)類型的電話線上。如另一個(gè)例子,通信接口可以是局域網(wǎng)(LAN)網(wǎng)卡以提供數(shù)據(jù)通信連接到兼容的局域網(wǎng)上。無(wú)線連接也可以實(shí)現(xiàn)。在任一這樣的實(shí)現(xiàn)方式中,通信接口1218傳送和接收電信號(hào)、電磁信號(hào)或光信號(hào),它們都攜帶代表不同類型信息的數(shù)字?jǐn)?shù)據(jù)流。
網(wǎng)絡(luò)鏈路1220通常通過(guò)一個(gè)或更多網(wǎng)絡(luò)提供數(shù)據(jù)通信到其它數(shù)據(jù)服務(wù)器。例如,網(wǎng)絡(luò)鏈路1220可提供連接經(jīng)由局域網(wǎng)1222到一個(gè)主機(jī)1224上或到互聯(lián)網(wǎng)服務(wù)供應(yīng)商(ISP)1226操作的數(shù)據(jù)設(shè)備上。接著ISP 1226通過(guò)廣域數(shù)據(jù)包通信網(wǎng)絡(luò),現(xiàn)在通常被稱作為“互聯(lián)網(wǎng)”1228,提供數(shù)據(jù)通信服務(wù)。局域網(wǎng)1222和互聯(lián)網(wǎng)1228都使用電信號(hào)、電磁信號(hào)或光信號(hào)傳送數(shù)字?jǐn)?shù)據(jù)流。經(jīng)過(guò)不同網(wǎng)絡(luò)傳送的信號(hào)、網(wǎng)絡(luò)鏈路1220上的信號(hào)和經(jīng)過(guò)通信接口1218的信號(hào)攜帶著數(shù)字?jǐn)?shù)據(jù)到達(dá)通信系統(tǒng)1200或離開通信系統(tǒng)1200,這些信號(hào)只是傳送信息的示范性載波。
通信系統(tǒng)1200可通過(guò)網(wǎng)絡(luò)、網(wǎng)絡(luò)鏈路1220和通信接口1218發(fā)出和接收數(shù)據(jù),包括程序代碼。例如在互聯(lián)網(wǎng)中,服務(wù)器1230可從應(yīng)用程序經(jīng)過(guò)互聯(lián)網(wǎng)1228、網(wǎng)絡(luò)服務(wù)供應(yīng)商1226、局域網(wǎng)1222和通信接口1218傳送請(qǐng)求代碼。
收到的代碼可由處理器1204執(zhí)行,和/或存儲(chǔ)在存儲(chǔ)裝置1210上,或其它非易失性存儲(chǔ)器用來(lái)以后執(zhí)行。按這種方式,計(jì)算機(jī)系統(tǒng)1200可獲得載波形式的應(yīng)用程序代碼。
以上所述僅為本發(fā)明的優(yōu)選實(shí)施例而已,并不用于限制本發(fā)明,對(duì)于本領(lǐng)域的技術(shù)人員來(lái)說(shuō),本發(fā)明可以有各種更改和變化。凡在本發(fā)明的精神和原則之內(nèi),所作的任何修改、等同替換、改進(jìn)等,均應(yīng)包含在本發(fā)明的權(quán)利要求范圍之內(nèi)。
權(quán)利要求
1.一種釋放內(nèi)存的方法,所述內(nèi)存與一組具有層次樹關(guān)系的對(duì)象相關(guān)聯(lián),所述方法包括以下計(jì)算機(jī)執(zhí)行的步驟創(chuàng)建具有所述層次樹關(guān)系的該組對(duì)象;為每個(gè)對(duì)象分配內(nèi)存;維持用于定義每個(gè)對(duì)象的內(nèi)存之間的關(guān)系的數(shù)據(jù);其中所述數(shù)據(jù)反映了層次樹關(guān)系的結(jié)構(gòu);接收請(qǐng)求以釋放與對(duì)象相關(guān)聯(lián)的內(nèi)存;以及響應(yīng)于接收所述請(qǐng)求,訪問(wèn)所述數(shù)據(jù)以確定哪些內(nèi)存與所述對(duì)象的一個(gè)或更多后代對(duì)象相關(guān)聯(lián),以及釋放與所述對(duì)象相關(guān)聯(lián)的內(nèi)存以及與所述對(duì)象的后代對(duì)象相關(guān)聯(lián)的內(nèi)存。
2.根據(jù)權(quán)利要求1所述的方法,其中與所述層次樹關(guān)系中最頂層的對(duì)象相關(guān)聯(lián)的內(nèi)存是一個(gè)堆,與所述層次樹關(guān)系中其他對(duì)象相關(guān)聯(lián)的內(nèi)存是所述堆的子堆,且所述分配步驟還包括為所述層次樹關(guān)系中最頂層的對(duì)象分配堆以及為層次樹關(guān)系中其余的對(duì)象分配所述堆的子堆。
3.根據(jù)權(quán)利要求1所述的方法,其中所述定義層次關(guān)系的數(shù)據(jù)包括子指針對(duì)和兄弟指針對(duì)維持所述數(shù)據(jù)的步驟還包括維持所述子指針對(duì)和所述兄弟指針對(duì),這些指針對(duì)用于定義每個(gè)對(duì)象的內(nèi)存之間的關(guān)系;以及訪問(wèn)所述數(shù)據(jù)的步驟還包括訪問(wèn)所述子指針對(duì)和所述兄弟指針對(duì),以確定所述對(duì)象的后代的一個(gè)或更多對(duì)象。
4.根據(jù)權(quán)利要求1所述的方法,其中所述分配步驟還包括通過(guò)調(diào)用由預(yù)處理器代碼生成的內(nèi)存管理可執(zhí)行代碼,為每個(gè)對(duì)象分配內(nèi)存。
5.根據(jù)權(quán)利要求4所述的方法,其中所述內(nèi)存管理可執(zhí)行代碼是一個(gè)新建運(yùn)算符,且所述分配步驟還包括通過(guò)調(diào)用所述新建運(yùn)算符為每個(gè)對(duì)象分配內(nèi)存。
6.根據(jù)權(quán)利要求1所述的方法,其中所述釋放步驟還包括通過(guò)調(diào)用由預(yù)處理器代碼生成的所述內(nèi)存管理可執(zhí)行代碼,來(lái)釋放與所述對(duì)象相關(guān)聯(lián)的內(nèi)存以及與所述對(duì)象的后代相關(guān)聯(lián)的內(nèi)存。
7.根據(jù)權(quán)利要求6所述的方法,其中所述內(nèi)存管理可執(zhí)行代碼是刪除運(yùn)算符,且所述釋放步驟還包括通過(guò)調(diào)用所述刪除運(yùn)算符釋放與所述對(duì)象相關(guān)聯(lián)的內(nèi)存以及與所述對(duì)象的后代相關(guān)聯(lián)的內(nèi)存。
8.根據(jù)權(quán)利要求6所述的方法,其中所述釋放步驟還包括通過(guò)調(diào)用單個(gè)的請(qǐng)求,釋放與所述對(duì)象相關(guān)聯(lián)的內(nèi)存以及與所述對(duì)象的后代相關(guān)聯(lián)的內(nèi)存。
9.根據(jù)權(quán)利要求8所述的方法,其中所述單個(gè)請(qǐng)求是所述對(duì)象的一個(gè)析構(gòu)器,且所述釋放步驟還包括通過(guò)調(diào)用所述析構(gòu)器,釋放與所述對(duì)象相關(guān)聯(lián)的內(nèi)存以及與所述對(duì)象的后代相關(guān)聯(lián)的內(nèi)存。
10.根據(jù)權(quán)利要求1所述的方法,其中特定對(duì)象的內(nèi)存在工廠方法中創(chuàng)建,且所述分配步驟還包括在所述工廠方法中為所述特定對(duì)象分配內(nèi)存。
11.根據(jù)權(quán)利要求1所述的方法,其中,在工廠方法中維持至少定義層次關(guān)系的數(shù)據(jù)的一部分,且所述維持步驟還包括至少維持定義特定對(duì)象內(nèi)存的層次關(guān)系的數(shù)據(jù)部分,其它對(duì)象的內(nèi)存在所述工廠方法中執(zhí)行。
12.根據(jù)權(quán)利要求1所述的方法,其中所述數(shù)據(jù)包括子指針對(duì)和兄弟指針對(duì),且維持用于定義層次關(guān)系的數(shù)據(jù)還包括維持所述子指針對(duì)和所述兄弟指針對(duì),這些指針對(duì)用于定義每個(gè)對(duì)象的內(nèi)存之間的關(guān)系。
13.根據(jù)權(quán)利要求1所述的方法,其中所述數(shù)據(jù)被維持在該組對(duì)象的數(shù)據(jù)成員中,且維持用于定義層次關(guān)系的數(shù)據(jù)還包括維持所述數(shù)據(jù)成員以定義每個(gè)對(duì)象的內(nèi)存之間的關(guān)系。
14.根據(jù)權(quán)利要求1所述的方法,其中所述數(shù)據(jù)被維持在用于每個(gè)對(duì)象的內(nèi)存中,且維持用于定義層次關(guān)系的數(shù)據(jù)還包括將數(shù)據(jù)維持在每個(gè)對(duì)象的內(nèi)存中,以定義內(nèi)存間的層次關(guān)系。
15.一種計(jì)算機(jī)可讀介質(zhì),其攜帶一個(gè)或更多個(gè)指令序列,用來(lái)釋放與一組具有層次樹關(guān)系的對(duì)象相關(guān)聯(lián)的內(nèi)存,其中所述一個(gè)或更多個(gè)的指令序列由一個(gè)或更多個(gè)處理器執(zhí)行,使得所述一個(gè)或更多處理器執(zhí)行以下步驟創(chuàng)建具有所述層次樹關(guān)系的該組對(duì)象;為每個(gè)對(duì)象分配內(nèi)存;維持用于定義每個(gè)對(duì)象的內(nèi)存之間的關(guān)系的數(shù)據(jù);其中所述數(shù)據(jù)反映了層次樹關(guān)系的結(jié)構(gòu);接收請(qǐng)求以釋放與對(duì)象相關(guān)聯(lián)的內(nèi)存;以及響應(yīng)于接收到的請(qǐng)求,訪問(wèn)所述數(shù)據(jù)以確定哪些內(nèi)存與所述對(duì)象的一個(gè)或更多后代對(duì)象相關(guān)聯(lián),以及釋放與所述對(duì)象相關(guān)聯(lián)的內(nèi)存以及與所述對(duì)象的后代對(duì)象相關(guān)聯(lián)的內(nèi)存。
16.根據(jù)權(quán)利要求15所述的計(jì)算機(jī)可讀介質(zhì),其中與所述層次樹關(guān)系最頂層的對(duì)象相關(guān)聯(lián)的內(nèi)存是一個(gè)堆,與所述層次樹關(guān)系中其余對(duì)象相關(guān)聯(lián)的內(nèi)存是所述堆的子堆,且所述分配步驟還包括為所述層次樹關(guān)系中最頂層的對(duì)象分配堆以及為層次樹關(guān)系中其余的對(duì)象分配所述堆的子堆。
17.根據(jù)權(quán)利要求15所述的計(jì)算機(jī)可讀介質(zhì),其中所述定義層次關(guān)系的數(shù)據(jù)包括子指針對(duì)和兄弟指針對(duì)維持所述子指針對(duì)和所述兄弟指針對(duì),這些指針對(duì)用于定義每個(gè)對(duì)象的內(nèi)存之間的關(guān)系;以及訪問(wèn)數(shù)據(jù)的步驟還包括訪問(wèn)所述子指針對(duì)和所述兄弟指針對(duì),以確定所述對(duì)象的后代的一個(gè)或更多對(duì)象。
18.根據(jù)權(quán)利要求15所述的計(jì)算機(jī)可讀介質(zhì),其中所述分配步驟還包括通過(guò)調(diào)用由預(yù)處理器代碼生成的內(nèi)存管理可執(zhí)行代碼,為每個(gè)對(duì)象分配內(nèi)存。
19.根據(jù)權(quán)利要求18所述的計(jì)算機(jī)可讀介質(zhì),其中所述內(nèi)存管理可執(zhí)行代碼是一個(gè)新建運(yùn)算符,且所述分配步驟還包括通過(guò)調(diào)用所述新建運(yùn)算符為每個(gè)對(duì)象分配內(nèi)存。
20.根據(jù)權(quán)利要求15所述的計(jì)算機(jī)可讀介質(zhì),其中所述釋放步驟還包括通過(guò)調(diào)用由預(yù)處理器代碼生成的所述內(nèi)存管理可執(zhí)行代碼,來(lái)釋放與所述對(duì)象相關(guān)聯(lián)的內(nèi)存以及與所述對(duì)象的后代相關(guān)聯(lián)的內(nèi)存。
21.根據(jù)權(quán)利要求20所述的計(jì)算機(jī)可讀介質(zhì),其中所述內(nèi)存管理可執(zhí)行代碼是刪除運(yùn)算符,且所述釋放步驟還包括通過(guò)調(diào)用所述刪除運(yùn)算符釋放與所述對(duì)象相關(guān)聯(lián)的內(nèi)存以及與所述對(duì)象的后代相關(guān)聯(lián)的內(nèi)存。
22.根據(jù)權(quán)利要求20所述的計(jì)算機(jī)可讀介質(zhì),其中所述釋放步驟還包括通過(guò)調(diào)用單個(gè)的請(qǐng)求,使得釋放與所述對(duì)象相關(guān)聯(lián)的內(nèi)存以及與所述對(duì)象的后代相關(guān)聯(lián)的內(nèi)存。
23.根據(jù)權(quán)利要求22所述的計(jì)算機(jī)可讀介質(zhì),其中所述單個(gè)請(qǐng)求是所述對(duì)象的一個(gè)析構(gòu)器,且所述釋放步驟還包括通過(guò)調(diào)用所述析構(gòu)器,釋放與所述對(duì)象相關(guān)聯(lián)的內(nèi)存以及與所述對(duì)象的后代相關(guān)聯(lián)的內(nèi)存。
24.根據(jù)權(quán)利要求15所述的計(jì)算機(jī)可讀介質(zhì),其中特定對(duì)象的內(nèi)存在工廠方法中創(chuàng)建,且所述分配步驟還包括在所述工廠方法中為所述特定對(duì)象分配內(nèi)存。
25.根據(jù)權(quán)利要求15所述的計(jì)算機(jī)可讀介質(zhì),其中,在工廠方法中維持至少定義層次關(guān)系的數(shù)據(jù)的一部分,且所述維持步驟還包括至少維持定義特定對(duì)象內(nèi)存的層次關(guān)系的數(shù)據(jù)部分,其余對(duì)象的內(nèi)存在所述工廠方法中執(zhí)行。
26.根據(jù)權(quán)利要求15所述的計(jì)算機(jī)可讀介質(zhì),其中所述數(shù)據(jù)包括子指針對(duì)和兄弟指針對(duì),且維持用于定義層次關(guān)系的數(shù)據(jù)還包括維持所述子指針對(duì)和所述兄弟指針對(duì),這些指針對(duì)用于定義每個(gè)對(duì)象的內(nèi)存之間的關(guān)系。
27.根據(jù)權(quán)利要求15所述的計(jì)算機(jī)可讀介質(zhì),其中所述數(shù)據(jù)被保存在該組對(duì)象的數(shù)據(jù)成員中,且保存所述定義層次關(guān)系的數(shù)據(jù)還包括維持所述數(shù)據(jù)成員以定義每個(gè)對(duì)象的內(nèi)存之間的關(guān)系。
28.根據(jù)權(quán)利要求15所述的計(jì)算機(jī)可讀介質(zhì),所述數(shù)據(jù)被維持在用于每個(gè)對(duì)象的內(nèi)存中,且維持用于定義層次關(guān)系的數(shù)據(jù)還包括將數(shù)據(jù)維持在每個(gè)對(duì)象的內(nèi)存中,以定義內(nèi)存間的層次關(guān)系。
全文摘要
本發(fā)明提供了一種為對(duì)象提供內(nèi)存管理的方法。具體地,描述了一種技術(shù),其用來(lái)為不同的類的對(duì)象提供通用內(nèi)存管理代碼以及釋放內(nèi)存管理樹中以特定對(duì)象開始的內(nèi)存管理子樹。內(nèi)存管理模板提供了通用預(yù)處理器內(nèi)存管理代碼。一種專用形式的內(nèi)存管理模板被用來(lái)創(chuàng)建專用模板子類。當(dāng)該專用模板子類的對(duì)象的一個(gè)內(nèi)存管理運(yùn)算符被調(diào)用時(shí),在專用模板中的通用內(nèi)存管理代碼被執(zhí)行。內(nèi)存與一個(gè)層次樹中的每個(gè)對(duì)象相關(guān)聯(lián)。內(nèi)存的數(shù)據(jù)被保存,它反映了對(duì)象之間的層次樹關(guān)系。子樹和與之相關(guān)聯(lián)的內(nèi)存可在不需要應(yīng)用程序跟蹤此關(guān)系的情況下被釋放。
文檔編號(hào)G06F12/02GK1653430SQ03810380
公開日2005年8月10日 申請(qǐng)日期2003年4月28日 優(yōu)先權(quán)日2002年5月7日
發(fā)明者穆罕默德·肖阿伊布·拉里, 拉維坎特·卡薩穆塞蒂, 斯里納特·克里希納斯瓦米 申請(qǐng)人:甲骨文國(guó)際公司