以下是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/