日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
C++資源管理應(yīng)用技巧講解

C++編程語(yǔ)言是一款功能強(qiáng)大的編程語(yǔ)言,它能夠幫助開(kāi)發(fā)人員輕松的實(shí)現(xiàn)各種功能。其中對(duì)于資源的管理是一個(gè)比較基礎(chǔ)的知識(shí),值得我們關(guān)注。在這里我們就為大家詳細(xì)講解C++資源管理的相關(guān)內(nèi)容。#t#

創(chuàng)新互聯(lián)基于分布式IDC數(shù)據(jù)中心構(gòu)建的平臺(tái)為眾多戶提供雙線服務(wù)器托管 四川大帶寬租用 成都機(jī)柜租用 成都服務(wù)器租用。

我最喜歡的對(duì)資源的定義是:"任何在你的程序中獲得并在此后釋放的東西。"內(nèi)存是一個(gè)相當(dāng)明顯的資源的例子。它需要用new來(lái)獲得,用delete來(lái)釋放。同時(shí)也有許多其它類型的資源文件句柄、重要的片斷、Windows中的GDI資源,等等。 將資源的概念推廣到程序中創(chuàng)建、釋放的所有對(duì)象也是十分方便的,無(wú)論對(duì)象是在堆中分配的還是在棧中或者是在全局作用于內(nèi)生命的。

對(duì)于給定的資源的擁有著,是負(fù)責(zé)釋放資源的一個(gè)對(duì)象或者是一段代碼。所有權(quán)分立為兩種級(jí)別--自動(dòng)的和顯式的(automatic and explicit),如果一個(gè)對(duì)象的釋放是由語(yǔ)言本身的機(jī)制來(lái)保證的,這個(gè)對(duì)象的就是被自動(dòng)地所有。例如,一個(gè)嵌入在其他對(duì)象中的對(duì)象,他的清除需要其他對(duì)象來(lái)在清除的時(shí)候保證。外面的對(duì)象被看作嵌入類的所有者。 類似地,每個(gè)在棧上創(chuàng)建的對(duì)象(作為自動(dòng)變量)的釋放(破壞)是在控制流離開(kāi)了對(duì)象被定義的作用域的時(shí)候保證的。這種情況下,作用于被看作是對(duì)象的所有者。注意所有的自動(dòng)所有權(quán)都是和語(yǔ)言的其他機(jī)制相容的,包括異常。無(wú)論是如何退出作用域的--正常流程控制退出、一個(gè)break語(yǔ)句、一個(gè)return、一個(gè)goto、或者是一個(gè)throw--自動(dòng)資源都可以被清除。

到目前為止,一切都很好!問(wèn)題是在引入指針、句柄和抽象的時(shí)候產(chǎn)生的。如果通過(guò)一個(gè)指針訪問(wèn)一個(gè)對(duì)象的話,比如對(duì)象在堆中分配,C++不自動(dòng)地關(guān)注它的釋放。程序員必須明確的用適當(dāng)?shù)某绦蚍椒▉?lái)釋放這些資源。比如說(shuō),如果一個(gè)對(duì)象是通過(guò)調(diào)用new來(lái)創(chuàng)建的,它需要用delete來(lái)回收。一個(gè)文件是用CreateFile(Win32 API)打開(kāi)的,它需要用CloseHandle來(lái)關(guān)閉。用EnterCritialSection進(jìn)入的臨界區(qū)(Critical Section)需要LeaveCriticalSection退出,等等。一個(gè)"裸"指針,文件句柄,或者臨界區(qū)狀態(tài)沒(méi)有所有者來(lái)確保它們的最終釋放?;镜馁Y源管理的前提就是確保每個(gè)C++資源管理都有他們的所有者。

一個(gè)指針,一個(gè)句柄,一個(gè)臨界區(qū)狀態(tài)只有在我們將它們封裝入對(duì)象的時(shí)候才會(huì)擁有所有者。這就是我們的第一規(guī)則:在構(gòu)造函數(shù)中分配資源,在析構(gòu)函數(shù)中釋放資源。

當(dāng)你按照規(guī)則將所有資源封裝的時(shí)候,你可以保證你的程序中沒(méi)有任何的資源泄露。這點(diǎn)在當(dāng)封裝對(duì)象(Encapsulating Object)在棧中建立或者嵌入在其他的對(duì)象中的時(shí)候非常明顯。但是對(duì)那些動(dòng)態(tài)申請(qǐng)的對(duì)象呢?不要急!任何動(dòng)態(tài)申請(qǐng)的東西都被看作一種資源,并且要按照上面提到的方法進(jìn)行封裝。這一對(duì)象封裝對(duì)象的鏈不得不在某個(gè)地方終止。它最終終止在最高級(jí)的所有者,自動(dòng)的或者是靜態(tài)的。這些分別是對(duì)離開(kāi)作用域或者程序時(shí)釋放資源的保證。

下面是C++資源管理的一個(gè)經(jīng)典例子。在一個(gè)多線程的應(yīng)用程序中,線程之間共享對(duì)象的問(wèn)題是通過(guò)用這樣一個(gè)對(duì)象聯(lián)系臨界區(qū)來(lái)解決的。每一個(gè)需要訪問(wèn)共享資源的客戶需要獲得臨界區(qū)。例如,這可能是Win32下臨界區(qū)的實(shí)現(xiàn)方法。

 
 
 
  1. class CritSect
  2. {
  3. friend class Lock;
  4. public:
  5. CritSect () { InitializeCriticalSection (&_critSection); }
  6. ~CritSect () { DeleteCriticalSection (&_critSection); }
  7. private
  8. void Acquire ()
  9. {
  10. EnterCriticalSection (&_critSection);
  11. }
  12. void Release ()
  13. {
  14. LeaveCriticalSection (&_critSection);
  15. }
  16. CRITICAL_SECTION _critSection;
  17. };

這里聰明的部分是我們確保每一個(gè)進(jìn)入臨界區(qū)的客戶最后都可以離開(kāi)。"進(jìn)入"臨界區(qū)的狀態(tài)是一種資源,并應(yīng)當(dāng)被封裝。封裝器通常被稱作一個(gè)鎖(lock)。

 
 
 
  1. class Lock
  2. {
  3. public:
  4. Lock (CritSect& critSect) : _critSect (critSect)
  5. {
  6. _critSect.Acquire ();
  7. }
  8. ~Lock ()
  9. {
  10. _critSect.Release ();
  11. }
  12. private
  13. CritSect & _critSect;
  14. };

鎖一般的用法如下:

 
 
 
  1. void Shared::Act () throw (char *)
  2. {
  3. Lock lock (_critSect);
  4. // perform action -- may throw
  5. // automatic destructor of lock
  6. }

注意無(wú)論發(fā)生什么,臨界區(qū)都會(huì)借助于語(yǔ)言的機(jī)制保證釋放。

還有一件需要記住的事情--每一種C++資源管理都需要被分別封裝。這是因?yàn)橘Y源分配是一個(gè)非常容易出錯(cuò)的操作,是要資源是有限提供的。我們會(huì)假設(shè)一個(gè)失敗的資源分配會(huì)導(dǎo)致一個(gè)異常--事實(shí)上,這會(huì)經(jīng)常的發(fā)生。所以如果你想試圖用一個(gè)石頭打兩只鳥(niǎo)的話,或者在一個(gè)構(gòu)造函數(shù)中申請(qǐng)兩種形式的資源,你可能就會(huì)陷入麻煩。只要想想在一種資源分配成功但另一種失敗拋出異常時(shí)會(huì)發(fā)生什么。因?yàn)闃?gòu)造函數(shù)還沒(méi)有全部完成,析構(gòu)函數(shù)不可能被調(diào)用,第一種資源就會(huì)發(fā)生泄露。

這種情況可以非常簡(jiǎn)單的避免。無(wú)論何時(shí)你有一個(gè)需要兩種以上資源的類時(shí),寫兩個(gè)笑的封裝器將它們嵌入你的類中。每一個(gè)嵌入的構(gòu)造都可以保證刪除,即使包裝類沒(méi)有構(gòu)造完成。


當(dāng)前名稱:C++資源管理應(yīng)用技巧講解
文章URL:http://www.dlmjj.cn/article/dhiseop.html