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

被折叠的 条评论
为什么被折叠?



