以下是C++程序的主要方法。

int main(){

    HRESULT hr = S_OK;
    IDataCollectorSet* pdcs = NULL;

    hr = CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);

    hr = CreateDCS(pdcs);
    if (FAILED(hr))
    {
        wprintf(L"CreateDCS failed.\n");
        goto cleanup;
    }

    hr = AddDataCollector(pdcs);
    if (FAILED(hr))
    {
        wprintf(L"AddDataCollector failed.\n");
        goto cleanup;
    }

    hr = SaveDCS(pdcs);
    if (FAILED(hr))
    {
        wprintf(L"SaveDCS failed.\n");
        goto cleanup;
    }

    hr = pdcs->Start(VARIANT_TRUE);
    if (FAILED(hr))
    {
        wprintf(L"pdcs->Start failed.\n");
        goto cleanup;
    }

    getchar();
cleanup:

    if (pdcs)
        pdcs->Release();

    CoUninitialize();


}

我不了解“清除”标签中的“Release()”函数将执行什么操作。如果可以为* pdcs调用Release()函数,是否不应该在IDataCollectorSet类下声明它?我在他们的文档中找不到定义为“Release()”的任何函数。

它在哪里声明,该函数的目的是什么?

注意:附带的头文件是
#include <windows.h>
#include <stdio.h>
#include <comutil.h>
#include <pla.h>

最佳答案

您正在使用COM对象,并且COM对象的内存管理是一项合作事务。

作为COM对象的使用者,您要在完成时告诉COM对象。您可以通过调用Release来实现。

在COM对象内部,它统计有多少用户对此对象进行了引用。通过调用AddRef可以增加引用,通过调用Release可以减少引用。当引用计数变为零时,该对象将知道没有其他人在引用该对象,并将清理其内存。这通常是通过在delete this方法中调用Release来完成的。

必须在正确的位置调用Release,这是必不可少的,否则您将通过未破坏的对象泄漏内存。与其使用原始的COM指针,不如使用CComPtr这样的智能指针,它会在对象超出范围时自动调用Release,并在传递对象时将调用AddRef

关于c++ - COM中的Release()函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21455882/

10-10 18:45
查看更多