自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

C++資源管理應(yīng)用技巧講解

開(kāi)發(fā) 后端
C++資源管理在實(shí)際程序應(yīng)用中是一個(gè)非常關(guān)鍵的操作技術(shù)。它能夠幫助我們很好的管理自己的程序,使得程序開(kāi)發(fā)更具有結(jié)構(gòu)化。

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

我最喜歡的對(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  

 

注意無(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í),寫(xiě)兩個(gè)笑的封裝器將它們嵌入你的類中。每一個(gè)嵌入的構(gòu)造都可以保證刪除,即使包裝類沒(méi)有構(gòu)造完成。

責(zé)任編輯:曹凱 來(lái)源: 博客園
相關(guān)推薦

2010-01-28 14:54:01

C++資源管理

2011-09-16 16:31:21

iPhone應(yīng)用Groove資源管理

2010-01-28 15:09:36

C++資源管理

2010-02-01 17:37:35

C++調(diào)用C鏈接庫(kù)

2010-02-01 15:01:34

C++拋出異常

2024-03-04 10:53:08

RAIIC++開(kāi)發(fā)

2013-12-21 19:58:32

SDN應(yīng)用資源管理平臺(tái)SDN

2009-08-19 13:36:21

C++資源管理方式

2011-07-28 16:06:34

IOS 應(yīng)用程序 資源

2013-12-03 18:31:43

SDN應(yīng)用編排資源管理

2010-02-06 15:49:31

刪除C++容器值

2010-02-01 11:13:00

C++ Traits

2010-02-06 13:52:39

C++ profile

2010-02-06 15:15:31

C++ Builder

2010-02-06 13:47:08

C++標(biāo)準(zhǔn)擴(kuò)展

2010-02-06 17:09:29

C++文件拷貝

2010-02-04 14:58:06

C++內(nèi)存分配

2010-02-01 17:09:07

C++鏈表操作

2010-02-05 13:44:06

C++ eof()函數(shù)

2010-02-06 17:21:20

C++ CreateT
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)