com对象的寿命(翻译)

本文介绍了COM对象寿命的处理方式。因多个应用程序可能同时使用同一COM对象,不能直接创建或销毁,系统用引用计数控制其寿命。接口申请时引用计数加1,释放时减1,计数为0对象自毁。还说明了引用计数增1和减1的操作及示例代码。

处理COM对象的寿命

   当对象创建的时候, 系统分配需要的内存资源。当对象不再需要的时候,对象应该被销毁,以便系统将该内存资源用于其他的目的。在C++中,你可以通过new和delete直接控制其对象的存在寿命。但是COM对象却不能直接被创建或销毁。原因是多个应用程序可能同时使用同一个COM对象。假如其中的一个应用程序撤销了COM对象,那么使用这个COM对象的其他应用程序就可能运行失败。系统使用引用计数来控制COM对象的存在寿命。

   对象的引用计数是用来标识接口被申请了几次的一个数字。接口被申请一次,使用计数便会增加1。当应用程序不再需要这个接口并且释放它的时候,引用计数就会减1。如果引用计数大于0,这个COM对象就继续存在内存中。当引用计数达到0的时候,这个对象就会自己销毁,你不需要知道关于这个COM对象的引用计数的任何事情。你只需得到或释放一个适当的接口,对象会自己判断它的存在寿命。

   注释:在COM应用程序中,适当的处理引用计数是至关重要的,不然很容易出现内存泄漏。COM程序员最常犯得一个错误是没有释放一个接口。当这种情况发生的时候,引用计数将永远不会达到0,这样COM对象将永远在内存中存在。


   引用计数的增1和减1

   任何时候你得到一个新的接口指针,引用计数都会通过呼叫IUnkown::AddRef来增加引用计数,但是你的应用程序通常不需要呼叫这个方法。假如你是通过创建一个对象来得到一个接口指针,也或者是通过IUnknown::QueryInterface得到的,对象将会自动的增加引用计数。但是,假如你是通过其他的方法得到接口指针的,比如:拷贝一个已经存在的指针,这样你必须显示的调用IUnkonwn::AddRef来增加应用计数。否则,当你释放前面的那个接口指针的时候, 这个COM对象就会有可能被销毁,尽管你可能还需要这个拷贝的指针。

   不管是你还你对象本身增加了引用计数,你都必须释放这个接口指针。当你不再需要这个接口指针的时候,你应该调用IUnknown::Release来减少引用计数的值。在实际的应用中,通常用NULL值来初始化指针变量,当你释放了这个指针的时候,你同样也需要把NULL值负给这个指针。这样允许你在你程序的清除代码段中测试所用的接口指针。这样如果指针的值不是NULL,说明这个些指针存在,在你的应用程序终止之前,你应该释放它们。

   下面的代码段扩充了在“使用CON接口”一文中讨论的事例代码,以便举例说明如何处理引用计数:


   IDirectSoundBuffer8 *pDSBPrimary = NULL ;
   IDirectSound3DListener8 *pDSListener = NULL ;
   IDirectSound3DListener8 *pDSListener2 = NULL ;
   ...
   //Create the object and obtain an additional interface.
   //The object increaments the reference count.
   if( FAILED( hr = g_pDS->CreateSoundBuffer( &dsbd, &pDSBPrimary, NULL )))
      retrun hr ;

   //Make a copy of the IDirectSound3DListener8 interface prointer
   //Call AddRef to incremnet the reference count and to ensure that
   //the object is not destroyed prematurely

   pDSListener2 = pDSListener ;
   pDSLintener2->AddRef() ;
   ...
   //Cleanup code. Check to see if the pointers are still active.
   //If they are, Call Release to release the interface.
   if( pDSBPrimary != NULL )
   {
      pDSBPrimary->Release();
      pDSBPrimary = NULL ;
   }
  
   if(pDSListener != NULL)
   {
      pDSListener->Release();
      pDSListener = NULL; 
   }
   if(pDSListener2 != NULL)
   {
      pDSListener2->Release();
      pDSListener2 = NULL;
   }

 

注: 由于翻译水平有限,错误在所难免。如发现翻译的不对的地方还请路上的朋友指正,谢谢

可以任意转载。

译者: closeall

 

2005.09.04 译

源码来自:https://pan.quark.cn/s/a4b39357ea24 ### 操作指南:洗衣机使用方法详解#### 1. 启动与水量设定- **使用方法**:使用者必须首先按下洗衣设备上的“启动”按键,同时依据衣物数量设定相应的“水量选择”旋钮(高、中或低水量)。这一步骤是洗衣机运行程序的开端。- **运作机制**:一旦“启动”按键被触发,洗衣设备内部的控制系统便会启动,通过感应器识别水量选择旋钮的位置,进而确定所需的水量高度。- **技术执行**:在当代洗衣设备中,这一流程一般由微处理器掌管,借助电磁阀调控进水量,直至达到指定的高度。#### 2. 进水过程- **使用说明**:启动后,洗衣设备开始进水,直至达到所选的水位(高、中或低)。- **技术参数**:水量的监测通常采用浮子式水量控制器或压力感应器来实现。当水位达到预定值时,进水阀会自动关闭,停止进水。- **使用提醒**:务必确保水龙头已开启,并检查水管连接是否牢固,以防止漏水。#### 3. 清洗过程- **使用步骤**:2秒后,洗衣设备进入清洗环节。在此期间,滚筒会执行一系列正转和反转的动作: - 正转25秒 - 暂停3秒 - 反转25秒 - 再次暂停3秒- **重复次数**:这一系列动作将重复执行5次,总耗时为280秒。- **技术关键**:清洗环节通过电机驱动滚筒旋转,利用水流冲击力和洗衣液的化学效果,清除衣物上的污垢。#### 4. 排水与甩干- **使用步骤**:清洗结束后,洗衣设备会自动进行排水,将污水排出,然后进入甩干阶段,甩干时间为30秒。- **技术应用**:排水是通过泵将水抽出洗衣设备;甩干则是通过高速旋转滚筒,利用离心力去除衣物上的水分。- **使用提醒**:...
代码下载地址: https://pan.quark.cn/s/c289368a8f5c 在安卓应用开发领域,构建一个高效且用户友好的聊天系统是一项核心任务。 为了协助开发者们迅速达成这一目标,本文将分析几种常见的安卓聊天框架,并深入说明它们的功能特性、应用方法及主要优势。 1. **环信(Easemob)** 环信是一个专为移动应用打造的即时通讯软件开发套件,涵盖了文本、图片、语音、视频等多种消息形式。 通过整合环信SDK,开发者能够迅速构建自身的聊天平台。 环信支持消息内容的个性化定制,能够应对各种复杂的应用场景,并提供多样的API接口供开发者使用。 2. **融云(RongCloud)** 融云作为国内领先的IM云服务企业,提供了全面的聊天解决方案,包括一对一交流、多人群聊、聊天空间等。 融云的突出之处在于其稳定运行和高并发处理性能,以及功能完备的后台管理工具,便于开发者执行用户管理、消息发布等操作。 再者,融云支持多种消息格式,如位置信息、文件传输、表情符号等,显著增强了用户聊天体验。 3. **Firebase Cloud Messaging(FCM)** FCM由Google提供的云端消息传递服务,可达成安卓设备与服务器之间的即时数据交换。 虽然FCM主要应用于消息推送,但配合Firebase Realtime Database或Firestore数据库,开发者可以开发基础的聊天软件。 FCM的显著优势在于其全球性的推送网络,保障了消息能够及时且精确地传输至用户。 4. **JMessage(极光推送)** 极光推送是一款提供消息发布服务的软件开发工具包,同时具备基础的即时通讯能力。 除了常规的文字、图片信息外,极光推送还支持个性化消息,使得开发者能够实现更为复杂的聊天功能。 此...
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值