【发布时间】:2012-04-28 02:56:56
【问题描述】:
我正在使用 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,它就会崩溃。
【问题讨论】:
-
一般来说,未释放的指针不会崩溃,只会造成内存泄漏。您创建的 sn-p 是否与您的完整程序一样?
-
@MarkRansom 我将崩溃范围缩小到调用
spVoice.Release()。我可以尝试创建一个有效的 sn-p 并继续添加内容,直到它崩溃。
标签: windows com atl smart-pointers sapi