AddItems c++中的OPC客户端内存泄漏



我正在编写OPCClient,但问题是内存泄漏
这是我从OPCServer 读取值的功能

VARIANT COPCClient::ReadValue(LPWSTR szItemID) {
IOPCItemMgt* pItemMgt = NULL;
tagOPCITEMDEF* pItems;
tagOPCITEMRESULT* pResult = NULL;
HRESULT* pErrors = NULL;
tagOPCITEMSTATE* pItemValue = NULL;
HRESULT hRes;
DWORD updateRate = 1000;
long bActive = 1;
pItemMgt = NULL;
//Добавление группы
if (m_hGroup != 0) {
hRes = m_pOPCServer->RemoveGroup(m_hGroup, 1);
m_hGroup = 0;
}
hRes = m_pOPCServer->AddGroup((LPWSTR)(L"MyGroup"), bActive, updateRate,
1, NULL, NULL, 0,
&m_hGroup, &updateRate, (GUID*)&__uuidof(IOPCItemMgt), (IUnknown**)&pItemMgt);

//Добавление элементов в группу
DWORD dwCount = 1;
pItems =
(tagOPCITEMDEF*)CoTaskMemAlloc(dwCount * sizeof(tagOPCITEMDEF));
pResult = NULL;
pErrors = NULL;
pItems[0].szItemID = szItemID;
pItems[0].szAccessPath = NULL;
pItems[0].bActive = TRUE;
pItems[0].hClient = 0;
pItems[0].vtRequestedDataType = VT_EMPTY;
pItems[0].dwBlobSize = 0;
pItems[0].pBlob = NULL;
hRes = pItemMgt->AddItems(1, pItems, &pResult, &pErrors);

IOPCSyncIO* pSyncIO = NULL;
IID IID_IOPCSYNCIO = __uuidof(IOPCSyncIO);
hRes = pItemMgt->QueryInterface(IID_IOPCSYNCIO, (void**)&pSyncIO);
pItemValue = NULL;
Sleep(50);
hRes = pSyncIO->Read(OPC_DS_CACHE, 1, &pResult->hServer, &pItemValue, &pErrors);
VARIANT res = pItemValue->vDataValue;
pSyncIO->Release();
CoTaskMemFree(pSyncIO);
CoTaskMemFree(pItemValue);
pItemMgt->Release();
CoTaskMemFree(pItemMgt);
CoTaskMemFree(pErrors);
CoTaskMemFree(pResult->pBlob);
CoTaskMemFree(pResult);
CoTaskMemFree(pItems);

return res;
}

我在一些网站上发现(这确实(,我需要从hResult->pBlob,但没有帮助。我确信AddItems中有这个问题。VS19说我在这个函数中损失了0.02 Kb。

如果您需要有关程序或解决方案的更多信息,请写下您想要的内容。

这可能不是完整的答案(取决于值中的数据类型(,但在执行CoTaskMemFree(pItemValue(之前,您还应该执行VariantClear(pItemValue->vDataValue(。这可能是Read部分的泄漏,但它只会用字符串或其他类型的VARIANT来显示自己,这些VARIANT本身有额外的指针。

但是,如果您正在寻找与AddItems相关的泄漏:您没有释放从AddItems获得的pErrors。您只是在释放从"读取"中获得的pErrors。

最新更新