C++編程中對(duì)象生命周期管理的論文_第1頁(yè)
C++編程中對(duì)象生命周期管理的論文_第2頁(yè)
C++編程中對(duì)象生命周期管理的論文_第3頁(yè)
C++編程中對(duì)象生命周期管理的論文_第4頁(yè)
C++編程中對(duì)象生命周期管理的論文_第5頁(yè)
已閱讀5頁(yè),還剩4頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、C+編程中對(duì)象生命周期管理的論文 關(guān)于C+編程中對(duì)象生命周期管理的論文 摘 要:在C+編程過(guò)程中,很容易出現(xiàn)內(nèi)存泄露等安全問(wèn)題,而導(dǎo)致這些問(wèn)題的核心原因就是在于沒(méi)有管理好對(duì)象生命周期。本文主要對(duì)C+編程中對(duì)象生命周期管理的幾種方式進(jìn)行分析并提出自己的見(jiàn)解。 關(guān)鍵詞:C+編程;對(duì)象;生命周期 C+編程中對(duì)象生命周期管理主要包括生成、使用和消除三個(gè)階段。對(duì)象不僅可以改變自己變量的狀態(tài),而且還擁有使用創(chuàng)建它的那個(gè)類中方法的能力,對(duì)象通過(guò)使用這些方法可以產(chǎn)生一定的行為。一個(gè)對(duì)象的生命周期結(jié)束而對(duì)象卻沒(méi)被釋放,那么內(nèi)存泄露問(wèn)題肯定會(huì)產(chǎn)生,因此,做好對(duì)象生命周期管理工作非常重要。 從理論上講,應(yīng)用程序中申

2、請(qǐng)的內(nèi)存一般都有其作用域,當(dāng)對(duì)象已經(jīng)完成其業(yè)務(wù)邏輯后,需要將其釋放,避免造成內(nèi)存泄露(全局對(duì)象除外)。例如,視圖和文檔,當(dāng)視圖對(duì)象已經(jīng)完成其業(yè)務(wù)邏輯后,用戶關(guān)閉對(duì)應(yīng)窗口時(shí),需要將其進(jìn)行釋放,而文檔對(duì)象可以在所有視圖對(duì)象釋放時(shí)釋放。因此,系統(tǒng)代碼就可以直接根據(jù)業(yè)務(wù)邏輯來(lái)編寫,這樣的代碼不僅效率高,而且容易理解。雖然采用這種方法直接編寫代碼有很多優(yōu)勢(shì),但是隨著需求的不斷增加,系統(tǒng)規(guī)模將會(huì)越來(lái)越大,也就越來(lái)越復(fù)雜,因此,上述那種簡(jiǎn)單的方法不適用于復(fù)雜的系統(tǒng)。例如,在上面的例子中加一個(gè)關(guān)閉文檔的操作,使用這個(gè)命令時(shí),將文檔直接關(guān)閉,可此時(shí)視圖也有可能是開(kāi)著的,關(guān)閉文檔需要將視圖先關(guān)閉,在視圖對(duì)象釋放時(shí)

3、進(jìn)行文檔釋放,那么此時(shí)用戶關(guān)閉對(duì)應(yīng)的窗口就變成了視圖對(duì)象的釋放條件。在一個(gè)復(fù)雜的系統(tǒng)中,一個(gè)對(duì)象要想釋放需要滿足很多條件才能實(shí)現(xiàn),此時(shí)都是按照業(yè)務(wù)邏輯來(lái)判斷程序,出錯(cuò)則不可避免。由此可知,用業(yè)務(wù)邏輯來(lái)管理對(duì)象生命周期的方式僅適用于簡(jiǎn)單對(duì)象系統(tǒng)。因此,筆者認(rèn)為使對(duì)象生命周期的管理更加合理和簡(jiǎn)化,需要設(shè)計(jì)另一些機(jī)制。 如果對(duì)文檔對(duì)象進(jìn)行釋放,將其釋放通知發(fā)送給相關(guān)的視圖對(duì)象,其二者關(guān)系是非常密切的。如果視圖對(duì)象暫時(shí)不釋放,可以清除文檔對(duì)象的引用,如若視圖對(duì)象釋放了,其結(jié)果也不會(huì)發(fā)生任何變化。當(dāng)創(chuàng)建好文檔和視圖后,引用是相互的,這里先從單項(xiàng)開(kāi)始,視圖引用文檔:(1)文檔的指針被視圖獲得;(2)文檔的

4、regFreeNotifiC+ation方法被視圖調(diào)用,文檔自己將會(huì)充當(dāng)參數(shù),文檔對(duì)象釋放 _列表中將會(huì)把文檔自己加入其中,也就是說(shuō),文檔對(duì)象釋放時(shí),將其釋放 _,需要讓列表中的所有對(duì)象都能夠知道;(3)此時(shí)文檔對(duì)象的指針,不會(huì)有什么不穩(wěn)定的現(xiàn)象產(chǎn)生,視圖對(duì)象就可以安安心心、大大方方的擁有;(4)如果文檔對(duì)象釋放了,將其通知給所有的列表對(duì)象,并且讓所有的對(duì)象進(jìn)行調(diào)用,由于視圖剛才已經(jīng)注冊(cè)過(guò)了,因此視圖也包括在內(nèi)。對(duì)列表中對(duì)象的freeNotifiC+ation方法進(jìn)行調(diào)用就是通知的方法,充分利用這個(gè)方法,在視圖的這個(gè)方法中,將文檔的引用清除掉;(5)如果先釋放的不是文檔對(duì)象,而是視圖對(duì)象,此時(shí)

5、文檔對(duì)象中的unregFreeNotifiC+ation方法就要被執(zhí)行,然后從列表中移除自己。 在Delphi語(yǔ)言的VC+L庫(kù)中同樣可采用這種方法。上述三個(gè)方法在VC+L的TC+omponent類上都被抽象了,只不過(guò)名稱不同而已,因此通過(guò)采用這種方法TC+omponent類及其子類的對(duì)象之間可以相互引用,并且能保證像野指針這類問(wèn)題是不會(huì)出現(xiàn)的。這種方法雖然有這么多的優(yōu)勢(shì),但是其也具有一定的缺點(diǎn),使其在使用時(shí)受到制約,例如,成本高、效率不高等。因此,這種方法在簡(jiǎn)單、高等級(jí)對(duì)象中比較適合使用。抽象對(duì)象引用以及后續(xù)的釋放環(huán)節(jié)是釋放通知機(jī)制的最大意義,使這個(gè)機(jī)制和業(yè)務(wù)邏輯本身無(wú)關(guān)。這樣,無(wú)論業(yè)務(wù)邏輯多

6、么復(fù)雜,開(kāi)發(fā)人員只要嚴(yán)格遵守這個(gè)機(jī)制,都可以確保野指針問(wèn)題不會(huì)出現(xiàn),從而使開(kāi)發(fā)人員的工作量大大減輕,并且開(kāi)發(fā)效率更高、程序質(zhì)量更好。 由上述分析可以看出,釋放通知雖然在生命周期管理中是一個(gè)很好的機(jī)制,但是也存在一些不足。例如,每個(gè)對(duì)象需要維護(hù)一個(gè)列表,可否不對(duì)列表進(jìn)行維護(hù),而對(duì)其進(jìn)一步抽象呢?在上文中已經(jīng)提出每個(gè)對(duì)象釋放時(shí)機(jī)都不同,而這些釋放時(shí)機(jī)的決定因素有很多,其中業(yè)務(wù)邏輯是最重要的,但是這個(gè)合理的釋放時(shí)機(jī)的確定是隨著業(yè)務(wù)邏輯的復(fù)雜性越來(lái)越復(fù)雜,已經(jīng)不是由單一的條件來(lái)決定,而是由多個(gè)條件同時(shí)制約。因此,要想滿足釋放必須滿足所有的條件,解決這個(gè)問(wèn)題的關(guān)鍵在于判斷這些條件。針對(duì)對(duì)象釋放,只關(guān)心這

7、個(gè)條件能夠滿足釋放要求,而對(duì)具體業(yè)務(wù)條件是什么不做重點(diǎn)考慮。因此,誕生了引用計(jì)數(shù)的機(jī)制,每一個(gè)對(duì)象由一個(gè)計(jì)數(shù)器,當(dāng)加一時(shí)就說(shuō)明釋放的條件并沒(méi)有滿足條件,當(dāng)減一時(shí)就說(shuō)明釋放條件已經(jīng)滿足條件,如果計(jì)數(shù)器為0就說(shuō)明所有的條件都滿足,對(duì)象可以釋放了。如果文檔被視圖引用的話,那么文檔的addRef方法被視圖調(diào)用,計(jì)數(shù)器增1;若文檔被引用的視圖釋放,則文檔的release方法就被視圖調(diào)用,同時(shí)計(jì)數(shù)器減1。當(dāng)計(jì)數(shù)器為0時(shí),文檔對(duì)象釋放。但是如果在這個(gè)過(guò)程中文檔被其他視圖使用,那么addRef方法也被那個(gè)視圖執(zhí)行,這樣就不會(huì)將文檔對(duì)象釋放,繼續(xù)由那個(gè)視圖使用,如此循環(huán),直到release方法被那個(gè)視圖使用為止

8、。0 class BaseRefObject public: BaseRefObject():m_nRefCount(0) void addRef() +m_nRefCount; void release() if (0 = m_RefCount) return; else -m_nRefCount; this; private: int m_nRefCount; 這種方法優(yōu)勢(shì)較明顯,其方式簡(jiǎn)單、效率高,可以在大規(guī)模對(duì)象系統(tǒng)中使用,但是同時(shí)也存在一些不足,具體表現(xiàn)在以下幾個(gè)方面:(1)文檔對(duì)象的釋放都是被動(dòng)的,影響其因素很多,尤其是外界因素,即使業(yè)務(wù)上要求文檔關(guān)閉,它也不會(huì)關(guān)閉,但是可以保持文

9、檔的內(nèi)容且把其作為一種標(biāo)志來(lái)放置,從而表明其已經(jīng)關(guān)閉。此時(shí)如果文檔的方法再被視圖調(diào)用的話,直接返回錯(cuò)誤。另外,這個(gè)過(guò)程的完成還可以借助使用事件的機(jī)制輔助來(lái)進(jìn)行,就是需要在關(guān)閉時(shí),向視圖發(fā)送事件,讓它將引用解除,這個(gè)步驟又與釋放通知有些相似;(2)循環(huán)引用問(wèn)題。上面的例子都只是假設(shè)文檔被視圖引用,而事實(shí)上視圖也可以被文檔引用。那么如果視圖被文檔引用的話,就會(huì)出現(xiàn)兩個(gè)對(duì)象相互引用,此時(shí)如果沒(méi)有外力作用,兩個(gè)對(duì)象的引用計(jì)數(shù)都不會(huì)變?yōu)?,于是內(nèi)存泄漏現(xiàn)象就由此產(chǎn)生了,它的產(chǎn)生是任何開(kāi)發(fā)者都不愿意看到的??傊?,引用計(jì)數(shù)也是一種機(jī)制,在微軟的C+OM中這種機(jī)制經(jīng)常被使用,它與業(yè)務(wù)邏輯沒(méi)有任何關(guān)系。 野指針

10、不是NULL指針而是指向非法內(nèi)存的指針,產(chǎn)生野指針的原因主要有:(1)沒(méi)有初始化指針變量。任何指針變量剛被創(chuàng)建時(shí)不會(huì)自動(dòng)成為NULL指針,它的默認(rèn)值是隨機(jī)的,它會(huì)亂指一氣。因此,指針變量初始化是要么將指針設(shè)置為NULL,要么讓它指向有效內(nèi)存。(2)指針p被free或者之后沒(méi)有置為NULL,讓人誤認(rèn)為p仍是一個(gè)有效的指針。(3)指針操作超越了變量的作用范圍。其實(shí)避免野指針發(fā)生的一個(gè)簡(jiǎn)單方法就是對(duì)象不釋放,但是對(duì)象不釋放會(huì)導(dǎo)致另一個(gè)問(wèn)題產(chǎn)生-內(nèi)存泄露,一旦出現(xiàn)了野指針,程序就會(huì)被迫停止運(yùn)行,而內(nèi)存泄露則不會(huì)導(dǎo)致程序立刻停止,它等到?jīng)]有資源再消耗時(shí)才停止。因此,為了避免野指針的發(fā)生,可暫時(shí)不管內(nèi)存泄

11、露問(wèn)題,等到出現(xiàn)資源不足時(shí)再想其他辦法(如資源不足時(shí),找出那些垃圾,將這些垃圾對(duì)象釋放掉,將其內(nèi)存給其他對(duì)象用),這是一個(gè)比較簡(jiǎn)單的方法。查找垃圾所采用的算法如下:首先,假設(shè)所有的對(duì)象都是垃圾;其次,利用全局變量和局部變量找出非垃圾對(duì)象,也就是找出沒(méi)有被它們引用的對(duì)象;再次,再?gòu)牡诙秸页龅姆抢鴮?duì)象中找出不是垃圾的對(duì)象,其方法就是非垃圾對(duì)象引用的對(duì)象也不是垃圾;第四步,將第三步驟循環(huán)下去,直到?jīng)]有新的非垃圾對(duì)象產(chǎn)生為止;最后,剩下的就都是垃圾。 由此可以看出,這種算法是非常簡(jiǎn)單的,但是在C+中,全局變量、局部變量和成員變量不全是對(duì)象,此時(shí)這個(gè)算法就有些不合適了,在JAVA等這些語(yǔ)言中都是對(duì)象

12、,此時(shí)需要語(yǔ)言級(jí)的支撐。到目前為止,最好的內(nèi)存管理機(jī)制也就是垃圾回收了,其避免野指針的產(chǎn)生是不需要人工來(lái)參與的,它也不會(huì)產(chǎn)生內(nèi)存泄露等問(wèn)題,其效率是非常高的,但是需要花費(fèi)大量的成本。 業(yè)務(wù)邏輯決定了對(duì)象的生命周期。事實(shí)上,業(yè)務(wù)邏輯是不斷變化的,朝著復(fù)雜的方向發(fā)展,此時(shí)具體到某個(gè)對(duì)象其釋放的條件可能比較復(fù)雜,因此,需要對(duì)這些對(duì)象的生命周期的管理需要引進(jìn)一些專門的機(jī)制來(lái)進(jìn)行,由此,釋放通知、引用計(jì)數(shù)、垃圾回收等機(jī)制就產(chǎn)生了。之所以產(chǎn)生如此多的機(jī)制,那是因?yàn)闆](méi)有一個(gè)機(jī)制能夠完全解決一切問(wèn)題,每個(gè)機(jī)制都有優(yōu)點(diǎn)和不足。筆者通過(guò)多年來(lái)的工作和學(xué)習(xí)發(fā)現(xiàn),用的最多的是引用計(jì)數(shù),但是在使用的同時(shí),也經(jīng)常會(huì)出現(xiàn)循環(huán)引用的問(wèn)題。由此可見(jiàn),最好的方法就是:將引用計(jì)數(shù)作為基礎(chǔ),在合適的地方根據(jù)業(yè)務(wù)邏輯加入釋放通知(這里主要使用事件通知,其實(shí)事件本身是為了業(yè)務(wù)的需要而設(shè)計(jì),并非是為了對(duì)象釋放,但從本質(zhì)上講業(yè)務(wù)決定著對(duì)象的生命周期)。 生命周期管理中這些機(jī)制的引用的原因有很多,其中一個(gè)重要原因

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論