用OPC Client开发时,需要从如下几个地方注意内存泄露
2013-07-19 09:25
645 查看
用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;
相关文章推荐
- android 开发中需要注意内存泄露的地方
- VS2008开发MOSS工作流几个需要注意的地方
- 开发COM+组件需要注意的几个地方
- VS2008开发MOSS工作流几个需要注意的地方
- 微信分享功能开发时需要注意的几个地方
- 用javascript做Asp开发语言需要注意的几个关键地方
- flex开发中关于内存释放几个注意的地方
- 关于atlas和webpart开发几个需要注意的地方。
- arcengine 开发几个注意释放内存的地方
- iOS开发笔记(六):UIButton需要注意的几个地方
- IIS+PHP+MySQL环境中PHP.INI需要注意的几个地方
- AsynckTask几点需要注意的几个地方
- Android组建4:android中需要注意的几个地方
- 4.1系统上平板开发需要注意的几个小问题
- 使用proguard需要注意的几个地方
- 通俗易懂地讲解Android app国际化实现方式,开发需要注意的地方
- CardView开发中需要注意的地方
- Lora程序设计需要注意的几个地方
- 【摘录】Ubuntu 10.10编译Android froyo可能需要注意的几个地方
- Python语言需要注意的几个地方