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。