`

引用计数和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。
在决定要对引用计数进行优化时,应给哪些没有进行引用计数的指针加上相应的注释,否则,其他程序员在修改代码时,将可能会增大接口指针的生命期,从而使引用计数的优化遭到破坏
分享到:
评论

相关推荐

    COM学习——动态绑定之引用计数

    动态绑定和引用计数的结合使用,使得COM对象可以在不预先知道具体实现的情况下被创建和使用。例如,在C++程序中,你可以通过CoCreateInstance函数创建一个COM对象,然后通过IUnknown接口的QueryInterface方法获取所...

    COM-引用计数

    例如,通过`CoCreateInstance`函数可以实例化一个COM对象,而`IUnknown::AddRef`和`IUnknown::Release`方法则用于增加和减少引用计数。 `AddRef`方法用于增加引用计数,通常在获取对象接口时调用。例如,当你使用`...

    模仿COM基本功能

    `QueryInterface`根据输入的IID返回相应的接口指针,`AddRef`和`Release`则管理引用计数。 在实践中,COM对象通常通过`CoCreateInstance`函数动态创建,该函数接收类ID(CLSID)和所需的接口ID,返回对应接口的指针...

    VC++ COM组件开发相关实例

    4.2 引用计数和AddRef/Release函数 引用计数 - 就是一个整数,作用是 表示接口的使用次数 AddRef - 增加引用计数 +1 Release - 减少引用计数 -1, 如果 当引用计数为0,接口被删除 4.3 使用 4.3.1 创建接口 ...

    COM IUnknown接口封装

    3. `AddRef`和`Release`实现:这两个方法通常只需要简单地对内部的引用计数器加1或减1,并在计数变为0时释放对象。 在`IUnknown`的封装过程中,还需要注意线程安全问题,特别是在多线程环境中,`AddRef`和`Release`...

    com自学视频教程

    计数引用AddRef与Release 内容提要: 1、内存资源何时释放 2、引用计数的原理 3、AddRef与Release的实现与使用 4、引用计数的优化 IDispatch接口与Variant类型 内容提要: 1、IDispatch的简介与作用 2、...

    Inside Ole 2nd

    另外,IUnknown接口是所有COM对象的基接口,包含了AddRef、Release和QueryInterface三个关键方法。AddRef和Release用于管理对象的引用计数,QueryInterface则用于获取对象支持的其他接口。 书中还详细介绍了COM的...

    《COM本质论》(侯捷)例子程序以及程序说明

    QueryInterface用于获取接口指针,AddRef和Release负责管理组件的生命周期,通过引用计数机制控制组件何时被释放。 4. **类工厂**:类工厂是创建组件实例的对象。当客户端请求一个新的组件实例时,会调用类工厂的...

    COM原理与应用 及 源码

    COM组件的创建遵循特定的生命周期管理规则,包括初始化(CoInitialize)、创建实例(CoCreateInstance)、增加引用计数(AddRef)、释放引用计数(Release)和销毁实例(CoUninitialize)。这些步骤确保了组件资源的...

    使用VC++编写ATL COM和测试COM

    它通过接口(Interface)和IUnknown基接口实现,接口定义了对象的行为,IUnknown提供了查询接口(QueryInterface)、增加引用计数(AddRef)和减少引用计数(Release)等基本服务。 ATL COM的优势在于它的模板类...

    ATL智能指针类CComPtr与CComQIPtr解析.pdf

    它自动处理`AddRef`和`Release`方法,确保在对象不再使用时正确地释放资源,防止内存泄漏。例如,当你创建一个CComPtr实例并赋值给它一个接口指针时,CComPtr会自动调用该接口的`AddRef`,增加引用计数。当CComPtr...

    用C模拟实现COM机制

    - `IBase`:定义了一个基础接口,包括`AddRef`和`Release`方法。 - `IQueryInterface`:从`IBase`继承,并添加了`QueryInterface`方法。 - `ISampleBase`:扩展了`IBase`,添加了一个`show`方法。 ##### 2. 示例...

    com组件管使用方法举例

    4. **IUnknown**:所有COM接口的基础,提供AddRef、Release和QueryInterface方法,用于引用计数和接口查询。 5. **工厂接口**:如IClassFactory,用于创建组件实例。客户端通过这个接口来实例化组件。 6. **注册和...

    COM 原理

    例如,`IUnknown`是COM的基本接口,所有COM接口都继承自它,包含了`QueryInterface`、`AddRef`和`Release`三个核心方法,用于接口指针的管理和引用计数。 引用计数是COM中管理对象生命周期的重要机制。每当客户获取...

    COM原理及代码实例.doc

    这是通过调用IUnknown接口的AddRef和Release方法实现的。 COM组件的创建和使用通常涉及以下步骤: 1. 创建:客户端通过CoCreateInstance函数或IClassFactory接口的CreateInstance方法来创建COM对象。 2. 接口查询:...

    COM本质论.rar

    4. **IUnknown接口**:这是所有COM对象都必须实现的接口,提供了对象的基本管理功能,如增加引用计数(AddRef)、减少引用计数(Release)和获取接口指针(QueryInterface)。 5. **引用计数**:COM通过引用计数来...

    保存的Com组件操作

    - IUnknown:所有COM接口都继承自IUnknown,提供AddRef、Release和QueryInterface方法,实现对象引用计数和接口获取。 2. **创建COM组件**: - 使用 ATL(Active Template Library)或者MFC(Microsoft ...

    8-COM组件1

    在COM组件的设计中,`IUnknown` 是所有COM接口的基础,它定义了三个基本方法:`QueryInterface`、`AddRef` 和 `Release`。`IUnknown` 接口用于对象的引用计数和接口查询,确保了对象生命周期的正确管理。然而,在...

    用VC进行COM编程所必须掌握的理论知识

    QueryInterface用于获取组件提供的其他接口,AddRef和Release则用于管理引用计数,确保组件生命周期的正确管理。 5. **引用计数(Reference Counting)**:COM通过引用计数来管理组件的生命周期。每当一个组件被...

Global site tag (gtag.js) - Google Analytics