用OPC Client开发时,需要从如下几个地方注意内存泄露

本文深入探讨了使用OPCClient进行开发时,如何有效避免内存泄露问题,通过实例展示了关键代码段中应注意的细节,包括正确释放资源的步骤,以确保程序的稳定性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用OPC Client开发时,需要从如下几个地方注意内存泄露:


(1)所有返回的指针,都要用CoTaskMemFree释放,如:

[delphi] view plaincopy
function Group_TryAddItems(AGroupIntf:IOPCItemMgt;AItemCount:integer;AItems:POPCITEMDEFARRAY):POPCITEMRESULTARRAY;  
var  
  vErrors: PResultList;  
begin  
  Result:=nil;  
  vErrors:=nil;  
  if AGroupIntf.AddItems(AItemCount,PSafeArray(AItems),Result,vErrors)<>S_OK then  
  begin  
    CoTaskMemFree(Result);  
    Result:=nil;  
  end;  
  CoTaskMemFree(vErrors);  
end;  

(2)用ISyncRead接口读取资料后,要用VariantClear释放,如:
[delphi] view plaincopy
function  Group_ReadItem2(AGroupIntf:IOPCItemMgt;AItemServerHandle:OPCHandle;out AQuality:Word):OLEVariant;  
var  
  vErrors:PResultList;  
  vOPCSyncIO:IOPCSyncIO;  
  ItemValues: POPCITEMSTATEARRAY;  
begin  
  OLECheck(AGroupIntf.QueryInterface(IID_IOPCSyncIO,vOPCSyncIO));  
  try  
    OPCErrorCheck(vOPCSyncIO.Read(OPC_DS_DEVICE,1,@AItemServerHandle,ItemValues,vErrors));  
    try  
      OPCResultErrorsCheck(1,nil,null,vErrors);  
      Result:=ItemValues^[0].vDataValue;  
      AQuality:=ItemValues^[0].wQuality;  
    finally  
      VariantClear(ItemValues^[0].vDataValue);  //memory leak  
      CoTaskMemFree(ItemValues);  
    end;  
  finally  
    vOPCSyncIO:=nil;  
  end;  
end;  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值