實作參考計數
參考計數需要在類別實作者和使用該類別物件的用戶端的一部分工作。 當您實作類別時,必須將 AddRef 和 Release 方法實作為 IUnknown 介面的一部分。 這兩種方法具有下列簡單的實作:
大部分物件的一般實作方法是只有這些方法的一個實作(以及 QueryInterface),這是在所有介面之間共用,因此會套用至整個對象的參考計數。 不過,從客戶端的觀點來看,參考計數是嚴格且清楚的個別介面指標概念,因此可以實作以動態建構、終結、載入或卸除其功能部分來利用這項功能的物件。 這些稱為 「卸除介面」。
每當用戶端呼叫方法(或 API 函式,例如 QueryInterface)傳回新介面指標時,所呼叫的方法會負責透過傳回的指標遞增參考計數。 例如,當用戶端第一次建立物件時,它會接收來自客戶端觀點之物件的介面指標,其參考計數為一。 如果客戶端接著在介面指標上呼叫 AddRef ,則參考計數會變成兩個。 客戶端必須在介面指標上呼叫 Release 兩次,才能卸除物件的所有參考。
當用戶端針對新介面或相同介面在第一個指標上呼叫 QueryInterface 時,參考計數是嚴格每個介面的範例。 在上述任一情況下,客戶端都必須針對每個指標呼叫 Release 一次。 當要求相同介面多次時,COM 不需要對象傳回相同的指標。 (唯一的例外狀況是查詢 IUnknown,識別 COM 的物件。)這可讓對象實作有效率地管理資源。
線程安全性也是實作 AddRef 和 Release 的重要問題。 如需詳細資訊,請參閱進程、線程和 Apartment。
相關主題