我正在使用 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;
}
Doesn't CComPtr
当底层对象超出范围时自动释放它吗?
我查看了实施CComPtr
它确实调用了Release
在析构函数本身。
所以我想知道可能出了什么问题,为什么如果我打电话Release
我自己,我的代码不会崩溃。但如果我不打电话Release
然后它崩溃了。
CComPtr 的析构函数将调用 Release。然而,当对象超出范围时,它就会这样做。在上面的代码中,这是在 main 返回之前,即after对 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 的析构函数之后运行,从而保证正确的顺序。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)