成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

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

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

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

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

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

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

下面是C++資源管理的一個經(jīng)典例子。在一個多線程的應(yīng)用程序中,線程之間共享對象的問題是通過用這樣一個對象聯(lián)系臨界區(qū)來解決的。每一個需要訪問共享資源的客戶需要獲得臨界區(qū)。例如,這可能是Win32下臨界區(qū)的實現(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. }; 

 

這里聰明的部分是我們確保每一個進入臨界區(qū)的客戶最后都可以離開。"進入"臨界區(qū)的狀態(tài)是一種資源,并應(yīng)當被封裝。封裝器通常被稱作一個鎖(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  

 

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

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

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

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

2010-01-28 14:54:01

C++資源管理

2011-09-16 16:31:21

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

2010-02-01 17:37:35

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

2010-01-28 15:09:36

C++資源管理

2010-02-01 15:01:34

C++拋出異常

2013-12-21 19:58:32

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

2009-08-19 13:36:21

C++資源管理方式

2024-03-04 10:53:08

RAIIC++開發(fā)

2013-12-03 18:31:43

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

2011-07-28 16:06:34

IOS 應(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++標準擴展

2010-02-06 17:09:29

C++文件拷貝

2010-02-04 14:58:06

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

2010-02-02 17:20:44

C++ switch-

2009-12-11 17:57:13

PHP應(yīng)用JSON

2011-08-19 10:31:08

資源管理器
點贊
收藏

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

主站蜘蛛池模板: 久久国产精品久久久久久 | 久久这里只有精品首页 | 亚洲国产日韩欧美 | 国产高潮好爽受不了了夜色 | 色视频一区二区 | 欧美一区二区三区在线视频 | 亚洲精品乱码久久久久久按摩观 | 国产精品久久久久一区二区三区 | 蜜桃视频一区二区三区 | 另类 综合 日韩 欧美 亚洲 | 久久久久久综合 | 欧美一区二区三区 | 亚洲国产成人精品久久久国产成人一区 | 欧美最猛性xxxxx亚洲精品 | 激情婷婷 | 色婷婷婷婷色 | 国产在线精品一区二区 | 国产一区二区三区四区区 | 国内精品久久久久久影视8 最新黄色在线观看 | 亚洲网站在线播放 | 在线观看涩涩视频 | 日本黄色免费视频 | 亚洲福利一区二区 | 亚洲欧洲日韩 | 国产欧美一区二区在线观看 | 日本免费黄色 | 精品一区二区三区中文字幕 | 精品视频一区二区三区在线观看 | 亚洲日本激情 | 亚洲成人精选 | 日韩有码在线播放 | 超碰在线久 | 欧美精品一区二区三区在线 | 麻豆久久精品 | 中文字幕免费在线 | 天天躁日日躁狠狠躁白人 | 国产不卡一区 | 羞羞视频免费观看 | 成人在线免费观看视频 | 国产精品免费一区二区三区四区 | 精品免费在线 |