久久九九国产无码高清_人人做人人澡人人人爽_日本一区二区三区中文字幕_日韩无码性爱免费

C++編程中對(duì)象生命周期管理的論文

時(shí)間:2024-10-01 11:45:59 生命畢業(yè)論文 我要投稿
  • 相關(guān)推薦

關(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ì)象生命周期管理的論文

  關(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ì)象生命周期管理工作非常重要。

  1. 業(yè)務(wù)邏輯

  從理論上講,應(yīng)用程序中申請(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)編寫(xiě),這樣的代碼不僅效率高,而且容易理解。雖然采用這種方法直接編寫(xiě)代碼有很多優(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í)進(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ī)制。

  2. 釋放通知

  如果對(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)文檔的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í)文檔對(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ù)邏輯多么復(fù)雜,開(kāi)發(fā)人員只要嚴(yán)格遵守這個(gè)機(jī)制,都可以確保野指針問(wèn)題不會(huì)出現(xiàn),從而使開(kāi)發(fā)人員的工作量大大減輕,并且開(kāi)發(fā)效率更高、程序質(zhì)量更好。

  3. 引用計(jì)數(shù)

  由上述分析可以看出,釋放通知雖然在生命周期管理中是一個(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)心這個(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è)視圖使用為止。[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)閉,但是可以保持文檔的內(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)系。

  4. 垃圾回收

  野指針不是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)存泄露問(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ì)象,此時(shí)需要語(yǔ)言級(jí)的支撐。到目前為止,最好的內(nèi)存管理機(jī)制也就是垃圾回收了,其避免野指針的產(chǎn)生是不需要人工來(lái)參與的,它也不會(huì)產(chǎn)生內(nèi)存泄露等問(wèn)題,其效率是非常高的,但是需要花費(fèi)大量的成本。

  結(jié)語(yǔ)

  業(yè)務(wù)邏輯決定了對(duì)象的生命周期。事實(shí)上,業(yè)務(wù)邏輯是不斷變化的,朝著復(fù)雜的方向發(fā)展,此時(shí)具體到某個(gè)對(duì)象其釋放的條件可能比較復(fù)雜,因此,需要對(duì)這些對(duì)象的生命周期的管理需要引進(jìn)一些專門(mé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è)重要原因就是減少一些內(nèi)存問(wèn)題的發(fā)生,并且達(dá)到高效率、高質(zhì)量的目標(biāo)。內(nèi)存泄露是普遍存在且必須解決的問(wèn)題,而本文所提到的這些機(jī)制沒(méi)有一個(gè)能真正解決內(nèi)存泄露問(wèn)題。因此,現(xiàn)階段程序員對(duì)此問(wèn)題進(jìn)行更深入的研究,將業(yè)務(wù)邏輯和編程事務(wù)性工作同時(shí)抓,同等程度重視二者。

  參考文獻(xiàn):

  . C++omputer Integrated ManufaC++turing Systems-C++IMS, 2004, (01).

【C++編程中對(duì)象生命周期管理的論文】相關(guān)文章:

CORBA對(duì)象生命周期的論文06-13

鋼材生命周期評(píng)價(jià)中GaBi軟件的應(yīng)用論文07-18

工程造價(jià)管理與全生命周期工程管理論文10-07

淺談施工企業(yè)項(xiàng)目管理團(tuán)隊(duì)的生命周期建設(shè)的論文08-11

淺談產(chǎn)品生命周期對(duì)營(yíng)銷渠道管理策略的影響論文10-18

企業(yè)生命周期的知識(shí)型員工績(jī)效管理的論文10-27

生命周期廣告策略的分析論文07-01

管理畢業(yè)論文-產(chǎn)品不同生命周期的廣告策略選擇09-04

關(guān)于生命周期角度評(píng)價(jià)成效論文05-18

企業(yè)生命周期市場(chǎng)營(yíng)銷論文10-26