Я работаю с API SAPI5 для обработки текста в речь. Если я упрощаю, мой код выглядит так (я удалил проверку ошибок, чтобы максимально упростить):
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
, он вылетит.
spVoice.Release()
. Я могу попробовать создать рабочий фрагмент и продолжать добавлять что-то, пока он не выйдет из строя. - person bodacydo   schedule 16.04.2012