首页 > 解决方案 > 如果我不对 COM 对象使用 Release,是否有任何内存/句柄泄漏

问题描述

我有一个使用 WASAPI 的多线程 COM 应用程序IAudioClient。我在主线程中创建客户端并在子线程中读取音频数据。音频客户端被声明为类成员:

CComPtr<IAudioClient>       audioClient;

在更改音频设备(如拔下耳机)时,我想激活另一个音频客户端但使用相同的 COM 对象,因此我Activate为音频客户端调用相同的 COM 对象:

HRESULT hr = mmDevice->Activate( __uuidof(IAudioClient), CLSCTX_ALL, NULL, (void**)&audioClient );

如果我在激活新对象之前不释放对象,我显然会在调试中得到这个断言: 在此处输入图像描述

因为在创建新对象之前我需要一个空 COM 变量,所以我得到了它。但是如果我audioClient.Release()在该Activate函数之前使用,我的应用程序会在发布时挂起。

我可以接受这个断言(此外,它只在调试中)。但问题是我可以只创建一个新对象而不释放旧对象,它会引入任何泄漏或什么吗?或者我应该以不同的方式释放物体以避免悬挂?

标签: c++windowsmultithreadingcomatl

解决方案


推荐阅读