當前位置:才華齋>計算機>C語言>

C語言中AddRef和Release的使用技巧

C語言 閱讀(5.81K)

引導語:你知道在C語言中AddRef和Release是一個怎樣的存在嗎,以下是本站小編分享給大家的C語言中AddRef和Release的使用技巧,歡迎閱讀!

C語言中AddRef和Release的使用技巧

AddRef和Release實現的是一種名為引用計數的記憶體管理技術,這種技術是使元件能夠自己將自己刪除的最簡單同時也是效率最高的方法。 COM元件將維護一個稱作是引用計數的數值。當客戶蟲元件取得一個介面時,此數值增1,當客戶使用完某個介面後,此數值將減1。當此數值為0時,元件即可將自己從記憶體中刪除。

為正確的使用引用計數,需要了解一下三條規則:

(1)在返回之前呼叫AddRef。對於哪些返回介面指標的函式,包括QueryInterface和CreateInstance,在返回之前用相應的指標呼叫AddRef。

(2)使用完介面之後呼叫此介面的`Release函式。

(3)在賦值之後呼叫AddRef。如在將一個介面賦給另外一個介面指標時呼叫AddRef。

生命期巢狀在引用同一介面的指標的生命期內的指標可以不進行引用計數。在函式中,無需對存在於區域性變數的介面指標進行引用計數。因為區域性變數的生命期同函式的生命期是一樣的,因此也將包含在呼叫者的生命期內。但當從某個全域性變數或向某個全域性變數複製一個指標時,則需要對此指標進行引用計數,因為全域性變數可以從任意函式中的任意地方被釋放

一般而言,客戶必須為每一個介面維護一個單獨的引用計數值。

總結引用計數的幾條具體規則如下:

(1)輸出引數規則。任何在輸出引數中(如QueryInterface的void** ppv)或作為返回值返回一個新的介面指標的函式必須對此介面指標呼叫AddRef。即在返回之前呼叫AddRef。

(2)輸出引數規則。在輸入引數(C++的按值傳遞的引數或常量)傳入函式的介面指標,無需呼叫AddRef和Release。因為函式的生命期巢狀在呼叫者的生命期內。

(3)輸入-輸出引數規則,即在函式體中可以使用輸入-輸出引數的值,然後可以對這些制進行修改並將其返回給呼叫者,對於具有這種功能的引數傳進來的介面指標,必須在給它賦另外一個介面指標值之前呼叫其Release,並在函式返回之前,對輸入引數中所儲存的介面指標呼叫AddRef。

(4)區域性變數規則。對於區域性複製的介面指標,由於它們只在函式的生命期內才存在,無需呼叫AddRef和Release。

(5)全域性變數規則。對於儲存在全域性變數中的介面指標,在將其傳遞給另外一個函式之前,必須呼叫其AddRef。對於儲存在成員變數中的介面指標,也應按此中方式進行處理。因為類中的任何成員函式都可以改變此中介面指標的狀態。

(6)不能確定時的規則。對於任何不能確定的情形,都應呼叫AddRef和Release。

在決定要對引用計數進行優化時,應給哪些沒有進行引用計數的指標加上相應的註釋,否則,其他程式設計師在修改程式碼時,將可能會增大介面指標的生命期,從而使引用計數的優化遭到破壞。