gpt4 book ai didi

windows - 我必须在 CComPtr 对象上调用 Release() 方法吗?

转载 作者:可可西里 更新时间:2023-11-01 09:43:28 24 4
gpt4 key购买 nike

我正在使用 SAPI5 API 处理文本到语音。如果我简化我的代码如下所示(我删除了错误检查以尽可能简化它):

int main() {
CoInitialize(NULL);
CComPtr<ISpVoice> spVoice;
spVoice.CoCreateInstance(CLSID_SpVoice);
...
CoUninitialize();
return 0;
}

由于某些奇怪的原因,如果我不调用 spVoice.Release(),我的代码就会崩溃。所以上面的代码崩溃了,但是这段代码工作得很好:

int main() {
CoInitialize(NULL);
CComPtr<ISpVoice> spVoice;
spVoice.CoCreateInstance(CLSID_SpVoice);
...
spVoice.Release();
CoUninitialize();
return 0;
}

CComPtr 是否会在超出范围时自动释放底层对象?

我查看了 CComPtr 的实现,它确实在析构函数本身中调用了 Release

所以我想知道可能出了什么问题,为什么如果我自己调用 Release,我的代码不会崩溃。但是,如果我不调用 Release,它就会崩溃。

最佳答案

CComPtr 的析构函数将调用 Release。但是,当对象超出范围时,它会这样做。在您上面的代码中,这恰好在 main 返回之前,对 CoUninitialize 的调用之后。

以下代码更正确,并保证析构函数在 CoUninitialize 之前运行。

int main() {
CoInitialize(NULL);
{ // Begin scope
CComPtr<ISpVoice> spVoice;
spVoice.CoCreateInstance(CLSID_SpVoice);
...
} / End scope, spVoice's destructor runs.
CoUninitialize();
return 0;
}

另一种方法是围绕 CoInitialize/CoUninitialize 创建一个 RAII 包装器。如果这个新对象在 spVoice 之前声明,它的析构函数将在 spVoice 的析构函数之后运行,以保证正确的顺序。

关于windows - 我必须在 CComPtr 对象上调用 Release() 方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10179884/

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