新聞中心
C++標(biāo)準(zhǔn)模板庫是由Alexander Stepanov、Meng Lee和David R Musser在惠普實驗室工作時所開發(fā)出來的,C++標(biāo)準(zhǔn)模板庫在C++中的應(yīng)用十分廣泛,這項技術(shù)在引進C++之前已經(jīng)使用很久了。

創(chuàng)新互聯(lián)公司專注于朝陽企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè)公司,購物商城網(wǎng)站建設(shè)。朝陽網(wǎng)站建設(shè)公司,為朝陽等地區(qū)提供建站服務(wù)。全流程專業(yè)公司,專業(yè)設(shè)計,全程項目跟蹤,創(chuàng)新互聯(lián)公司專業(yè)和態(tài)度為您提供的服務(wù)
我們會假設(shè)一個失敗的資源分配會導(dǎo)致一個異常--事實上,這會經(jīng)常的發(fā)生。所以如果你想試圖用一個石頭打兩只鳥的話,或者在一個構(gòu)造函數(shù)中申請兩種形式的資源,你可能就會陷入麻煩。
只要想想在一種資源分配成功但另一種失敗拋出異常時會發(fā)生什么。因為構(gòu)造函數(shù)還沒有全部完成,析構(gòu)函數(shù)不可能被調(diào)用,第一種資源就會發(fā)生泄露。這種情況可以非常簡單的避免。無論何時你有一個需要兩種以上資源的類時,寫兩個笑的封裝器將它們嵌入你的類中。每一個嵌入的構(gòu)造都可以保證刪除,即使包裝類沒有構(gòu)造完成。
我們至今還沒有討論最常見類型的資源--用操作符new分配,此后用指針訪問的一個對象。我們需要為每個對象分別定義一個封裝類嗎?(事實上,C++標(biāo)準(zhǔn)模板庫已經(jīng)有了一個模板類,叫做auto_ptr,其作用就是提供這種封裝。我們一會兒在回到auto_ptr。)讓我們從一個極其簡單、呆板但安全的東西開始??聪旅娴腟mart Pointer模板類,它十分堅固,甚至無法實現(xiàn)。
- class Lock
- {
- public:
- Lock (CritSect& critSect)
- : _critSect (critSect)
- {
- _critSect.Acquire ();
- }
- ~Lock ()
- {
- _critSect.Release ();
- }
- private
- CritSect & _critSect;
- };
- 鎖一般的用法如下:
- void Shared::Act () throw (char *)
- {
- Lock lock (_critSect);
- // perform action -- may throw
- // automatic destructor of lock
- }
為什么要把SPtr的構(gòu)造函數(shù)設(shè)計為protected呢?如果我需要遵守第一條規(guī)則,那么我就必須這樣做。資源--在這里是class T的一個對象--必須在封裝器的構(gòu)造函數(shù)中分配。但是我不能只簡單的調(diào)用new T,因為我不知道T的構(gòu)造函數(shù)的參數(shù)。
因為,在原則上,每一個T都有一個不同的構(gòu)造函數(shù);我需要為他定義個另外一個封裝器。C++標(biāo)準(zhǔn)模板庫的用處會很大,為每一個新的類,我可以通過繼承SPtr定義一個新的封裝器,并且提供一個特定的構(gòu)造函數(shù)。
同樣的,你也可以再你的代碼中用加強Release的可靠性。相應(yīng)的Pop方法要做些什么呢?他應(yīng)該釋放了資源并祈禱調(diào)用它的是一個負責(zé)的人而且立即作一個資源傳遞它到一個Smart Pointer?這聽起來并不好。
資源管理在內(nèi)容索引(Windows NT Server上的一部分,現(xiàn)在是Windows 2000)上工作,并且,我對這十分滿意。然后我開始想……這一方法是在這樣一個完整的系統(tǒng)中形成的,如果可以把它內(nèi)建入語言的本身豈不是一件非常好?我提出了強指針(Strong Pointer)和弱指針(Weak Pointer)。
一個Strong Pointer會在許多地方和我們這個SPtr相似--它在超出它的作用域后會清除他所指向的對象。資源傳遞會以強指針賦值的形式進行。也可以有Weak Pointer存在,它們用來訪問對象而不需要所有對象--比如可賦值的引用。
任何C++標(biāo)準(zhǔn)模板庫都必須聲明為Strong或者Weak,并且語言應(yīng)該來關(guān)注類型轉(zhuǎn)換的規(guī)定。例如,你不可以將Weak Pointer傳遞到一個需要Strong Pointer的地方,但是相反卻可以。Push方法可以接受一個Strong Pointer并且將它轉(zhuǎn)移到Stack中的Strong Pointer的序列中。Pop方法將會返回一個Strong Pointer。把Strong Pointer的引入語言將會使垃圾回收成為歷史。
網(wǎng)站欄目:進行C++標(biāo)準(zhǔn)模板庫管理
文章分享:http://www.fisionsoft.com.cn/article/codhicc.html


咨詢
建站咨詢
