共用方式為


實作參考計數

參考計數需要類別的實作者和使用該類別物件的使用者都付出努力。 當您實作類別時,您必須實作 AddRefRelease 方法,做為 IUnknown介面的一部分。 這兩種方法具有下列簡單的實作:

  • AddRef 遞增對象的內部參考計數。
  • Release 會先遞減對象的內部參考計數,然後檢查參考計數是否已降至零。 如果有,這表示沒有人再使用 物件,因此 Release 函式會解除分配物件。

大部分物件的常見實作方法是在所有介面之間共用這些方法的唯一實作(包括 QueryInterface),因此引用計數會套用至整個物件。 不過,從使用者的觀點來看,引用計數是一個嚴格且清楚的每個介面指標的概念,因此可以實作這些物件,讓它們能根據現有的介面指標,動態構建、銷毀、加載或卸載功能部分。 這些俗稱為 卸除介面

每當用戶端呼叫方法(或 API 函式),例如 QueryInterface,會傳回新的介面指標時,所呼叫的方法會負責透過傳回的指標遞增參考計數。 例如,當客戶第一次建立物件時,它會接收一個從客戶角度來看其參考計數為一的物件介面指針。 如果客戶端接著在介面指標上呼叫 AddRef,則參考計數會變成兩個。 客戶端必須在介面指標上呼叫 Release 兩次,以釋放對該物件的所有引用。

當客戶端針對新介面或相同介面的第一個指標呼叫 QueryInterface 時,這是一個顯示參考計數是嚴格依照每個介面指標來進行的範例。 在這兩種情況下,客戶端都必須針對每個指標呼叫 Release 一次。 當要求相同介面多次時,COM 不需要對象傳回相同的指標。 (唯一的例外是查詢來 IUnknown,它會識別 COM 的物件。這可讓對象實作有效率地管理資源。

線程安全性也是實作 AddRefRelease的重要問題。 如需詳細資訊,請參閱 進程、線程和 Apartment

透過參考計數管理物件存留期