文档章节

引用计数和AddRef、Release

雷霄骅
 雷霄骅
发布于 2014/08/16 13:47
字数 904
阅读 30
收藏 0

 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。

在决定要对引用计数进行优化时,应给哪些没有进行引用计数的指针加上相应的注释,否则,其他程序员在修改代码时,将可能会增大接口指针的生命期,从而使引用计数的优化遭到破坏

本文转载自:http://blog.csdn.net/leixiaohua1020/article/details/12720163

雷霄骅
粉丝 211
博文 419
码字总数 2129
作品 4
朝阳
程序员
私信 提问
《XPCOM组件开发》笔记(一)

本书是关于Gecko和基于Gecko应用程序来开发XPCOM组件的。简介部分探讨组件的概念,第一章你将编译简单的代码并注册到Mozilla中,此时会探讨组件和模块之间的关系,XPCOM接口以及注册的过程。...

嗯哼9925
2017/12/19
0
0
COM组件开发实践(六)---From C++ to COM :Part 3

在上一篇文章《COM组件开发实践(五)---From C++ to COM :Part 2 》中,我们进展到使用COM库加载C++对象了,这一篇中我们将真正将C++对象变成 COM对象,而在下一篇中我们将为它添加多接口支...

嗯哼9925
2017/12/21
0
0
Chromium的智能指针/引用计数/Callback/Bind

这四个东西对使用者来说不难,看懂代码注释里的例子即可,预计1小时左右看懂全部。要去理解其设计思想的话最需要掌握的是模板类的使用,但一般使用者完全不用关心怎么设计的。 使用者的学习路...

zhangyujsj
2015/08/22
146
0
ATL智能指针类剖析

CComPtr CComPtr派生自模板类CComPtrBase,T代表某个COM接口。CComPtrBase类只有一个成员变量T* p。下面是它们的代码分析: 构造函数 protected: CComPtrBase() throw() { p = NULL; } CComP...

长平狐
2012/08/28
707
0
用标准C编写COM(一)

cdllbufferstruct编译器微软 目录(?)[-] 简介 COM对象和虚表 GUID QueryInterfaceAddRef and Release IClassFactory对象 打包到DLL中 CC包含文件 定义文件DEF 安装DLL和注册对象 C实例程序 ...

长征4号
2017/08/07
0
0

没有更多内容

加载失败,请刷新页面

加载更多

IT兄弟连 HTML5教程 HTML5表单 小结及习题

小结 HTML表单提交的方法有get方法和post方法,get方法的作用是从指定的资源请求数据,post方法的作用是向指定的资源提交要被处理的数据。HTML表单一直都是Web的核心技术之一,有了它我们才能...

老码农的一亩三分地
17分钟前
9
0
向maven工程中导入自己封装好的jar包方法

1.打开cmd窗口 输入并执行:mvn install:install-file -DgroupId=com.test   -DartifactId=ptest -Dversion=0.1  -Dfile=E:\test\test-0.1.0.jar    -Dpackaging=jar注:Dgr......

gantaos
19分钟前
3
0
【jQuery基础学习】09 jQuery与前端(这章很水)

本文转载于:专业的前端网站➨【jQuery基础学习】09 jQuery与前端(这章很水) 这章主要是将如何将jQuery应用到网站中,或者说其实就是一些前端知识,对于我这种后端程序来说其实还是蛮有用的...

前端老手
31分钟前
8
0
深度科技与金山云完成兼容互认证 共同促进我国软件生态发展

近日,深度科技与金山云完成兼容互认证工作,经双方共同严格测试,深度操作系统ARM服务器版软件V15与金山云分布式数据库软件DragonBase V1.0相互兼容、稳定运行,可以为企业级应用提供全面保...

后浪涛涛
32分钟前
7
0
Less导入选项

Less 提供了CSS @import CSS规则的几个扩展,以提供更多的灵活性来处理外部文件。 语法: @import (keyword) "filename"; 以下是导入指令的相关详情: reference,使用较少的文件但不输出。 ...

凌兮洛
48分钟前
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部