用OPC Client開發時,需要從如下幾個地方注意記憶體泄露:
(1)所有返回的指標,都要用CoTaskMemFree釋放,如:
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釋放,如:
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;