COM中的Release()函数 是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(); }

COM中的Release()函数 是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(); },c++,windows,visual-studio-2010,visual-c++,com,C++,Windows,Visual Studio 2010,Visual C++,Com,我不明白“cleanup”标记中的“Release()”函数做了什么。如果可以为*pdcs调用Release()函数,那么它不应该在IDataCollectorSet类下声明吗?我在他们的文档中找不到任何定义为“Release()”的函数 它在哪里声明?此函数的目的是什么 注意:包含的头文件是 #include <windows.h> #include <stdio.h> #include <comutil.h> #include <pla.h>

我不明白“cleanup”标记中的“Release()”函数做了什么。如果可以为*pdcs调用Release()函数,那么它不应该在IDataCollectorSet类下声明吗?我在他们的文档中找不到任何定义为“Release()”的函数

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

注意:包含的头文件是

#include <windows.h>
#include <stdio.h>
#include <comutil.h>
#include <pla.h>
#包括
#包括
#包括
#包括
发布是任何COM对象实现的一种方法

其目的是:。当引用计数器降至零时,
IUnknown::Release()
的实现必须销毁该对象。

Release是任何COM对象实现的一种方法


其目的是:。当引用计数器降至零时,
IUnknown::Release()的实现
必须销毁该对象。

如果不知道
IDataCollectorSet
很难说,但我猜它释放了该类获得的一些资源。

如果不知道
IDataCollectorSet
很难说,但我猜它释放了该类获得的一些资源。

此版本来自IUnknown:

IUnknown::Release


COM接口继承自它。调用Release会降低COM对象的引用计数,最终实现它。

此版本来自IUnknown:

IUnknown::Release


COM接口继承自它。调用Release降低了COM对象的引用计数,最终实现了它。

您使用的是COM对象,COM对象的内存管理是一项合作事务

作为COM对象的消费者,您的工作是在完成COM对象时告诉它。您可以通过调用
Release
来完成此操作

在COM对象内部,它会记录有多少用户引用它。通过调用
AddRef
增加引用,通过调用
Release
减少引用。当引用计数为零时,对象知道没有其他人在引用它,并将清理其内存。这通常通过调用
Release
方法中的
删除此
来完成


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

您使用的是COM对象,COM对象的内存管理是一项合作事务

作为COM对象的消费者,您的工作是在完成COM对象时告诉它。您可以通过调用
Release
来完成此操作

在COM对象内部,它会记录有多少用户引用它。通过调用
AddRef
增加引用,通过调用
Release
减少引用。当引用计数为零时,对象知道没有其他人在引用它,并将清理其内存。这通常通过调用
Release
方法中的
删除此
来完成


必须在正确的位置调用
Release
,否则会通过未被销毁的对象泄漏内存。最好不要使用原始的COM指针,最好使用智能指针,比如当对象超出范围时,它会自动调用<代码>发布<代码>,当你通过对象时,将调用<代码> AddiFF < /C>。 C++中没有<代码> RelaseEe(/Case>函数),它不是C++标准的一部分。这是一个COM函数,所以你的标题有点误导。我现在已经编辑了标题。谢谢!当我发布问题时,我不知道为什么要给
hr
(S_OK和
CoInitializeEx
的结果)分配两个值,如果你总是要用
CreateDCS
的结果覆盖它?谢谢你指出这一点。我将改正它,没有<代码> RelaseEngy//Cuff> C++中的函数,它不是C++标准的一部分。这是一个COM函数,所以你的标题有点误导。我现在已经编辑了标题。谢谢!当我发布问题时,我不知道为什么要给
hr
(S_OK和
CoInitializeEx
的结果)分配两个值,如果你总是要用
CreateDCS
的结果覆盖它?谢谢你指出这一点。我会改正的