COM中的Release()函数

Des*_*PRG 1 c++ windows com visual-studio-2010 visual-c++

以下是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();


}
Run Code Online (Sandbox Code Playgroud)

我不明白"清理"标签中的"Release()"功能是做什么的.如果可以为*pdcs调用Release()函数,不应该在IDataCollectorSet类下声明它吗?我在他们的文档中找不到任何定义为"Release()"的函数.

它在哪里宣布,这个功能的目的是什么?

注意:包含的头文件是

#include <windows.h>
#include <stdio.h>
#include <comutil.h>
#include <pla.h>
Run Code Online (Sandbox Code Playgroud)

Sea*_*ean 6

您正在使用COM对象,COM对象的内存管理是一种合作事件.

作为COM对象的comsumer,完成它后告诉COM对象是你的工作.你通过电话来做到这一点Release.

在COM对象内部,它会保留有多少用户对其进行引用的计数.通过调用增加引用AddRef,并通过调用减少引用Release.当引用计数变为零时,对象知道没有其他人正在引用它并将清理其内存.这通常通过delete thisRelease方法中调用来完成.

你必须Release在正确的地方打电话,否则你会通过未被破坏的物品泄漏记忆.不使用原始COM指针,最好使用CComPtr等智能指针,Release当对象超出范围时会自动调用,并AddRef在传递对象时调用.