gpt4 book ai didi

c++ - COM 中的 Release() 函数

转载 作者:可可西里 更新时间:2023-11-01 10:54:00 25 4
gpt4 key购买 nike

下面是一个c++程序的main方法。

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();


}

我不明白“cleanup”标签中的“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 减少引用。当引用计数变为零时,对象知道没有其他人在引用它并且将清理它的内存。这通常通过在 Release 方法中调用 delete this 来完成。

在正确的地方调用 Release 很重要,否则您会通过未被销毁的对象泄漏内存。最好不要使用原始 COM 指针,而是使用智能指针,例如 CComPtr它将在对象超出范围时自动调用 Release,并在您传递对象时调用 AddRef

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com