AddItems C++ 中的 OPCClient 内存泄漏
OPCClient memory leak in AddItems c++
我正在尝试编写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 显示自身。
但是,如果您正在寻找与 AddItems 相关的泄漏:您没有释放从 AddItems 获得的 pErrors。您只是释放了从读取中获得的 pErrors。
我正在尝试编写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 显示自身。
但是,如果您正在寻找与 AddItems 相关的泄漏:您没有释放从 AddItems 获得的 pErrors。您只是释放了从读取中获得的 pErrors。