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 译

【电动车】基于多目标优化遗传算法NSGAII的峰谷分时电价引导下的电动汽车充电负荷优化研究(Matlab代码实现)内容概要:本文围绕“基于多目标优化遗传算法NSGA-II的峰谷分时电价引导下的电动汽车充电负荷优化研究”展开,利用Matlab代码实现优化模型,旨在通过峰谷分时电价机制引导电动汽车有序充电,降低电网负荷波动,提升能源利用效率。研究融合了多目标优化思想与遗传算法NSGA-II,兼顾电网负荷均衡性、用户充电成本和充电满意度等多个目标,构建了科学合理的数学模型,并通过仿真验证了方法的有效性与实用性。文中还提供了完整的Matlab代码实现路径,便于复现与进一步研究。; 适合人群:具备一定电力系统基础知识和Matlab编程能力的高校研究生、科研人员及从事智能电网、电动汽车调度相关工作的工程技术人员。; 使用场景及目标:①应用于智能电网中电动汽车充电负荷的优化调度;②服务于峰谷电价政策下的需求侧管理研究;③为多目标优化算法在能源系统中的实际应用提供案例参考; 阅读建议:建议读者结合Matlab代码逐步理解模型构建与算法实现过程,重点关注NSGA-II算法在多目标优化中的适应度函数设计、约束处理及Pareto前沿生成机制,同时可尝试调整参数或引入其他智能算法进行对比分析,以深化对优化策略的理解。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值