我是否必须在 CComPtr 对象上调用 Release() 方法?

2024-06-23

我正在使用 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(使用前将#替换为@)

我是否必须在 CComPtr 对象上调用 Release() 方法? 的相关文章

  • 我可以在 Windows Azure 中设置成本上限吗?

    我想设置一个 Windows Azure 帐户 我是 MSDN 订阅者 因此前 16 个月我可以 免费 获得它 尽管如此 微软还是想要我的信用卡号码 以防我超出免费限额 从理论上讲 这意味着我正在向微软写一份全权委托书来向我的信用卡收取费用
  • 在 C#/VB.NET 或 C++ Win32 中启用/禁用 Aero

    如何在 C NET 或 C Win32 中禁用航空效果 这是我在 C C 中的测试代码 但仅在我的应用程序运行时才有效 include
  • 如何使文件自我更新(Native C++)

    我将 Microsoft Visual Studio 2008 与 Windows 目标部署结合使用 我如何使文件 自我更新 我已经完成了 通过网络传输 部分 但是如何使可执行文件重写自身 基本上 我想为还包含自动更新程序的目录编写一个自动
  • 如何正确调用 LsaLogonUser 进行交互式登录?

    我正在尝试使用 LsaLogonUser 创建交互式登录会话 但它总是返回STATUS INVALID INFO CLASS 0xc0000003 从网上查到的内存布局KERB INTERACTIVE LOGON结构很棘手 但我很确定我做得
  • 如何防止从快照恢复虚拟机时出现“本机与域之间的信任关系失败”错误?

    当您从 足够旧的 快照恢复虚拟机 属于 Windows 域 时 您将收到以下错误 本机与域之间的信任关系失败 发生这种情况是因为域控制器定期更新计算机帐户密码 可能还有其他一些事情 有什么方法可以配置域控制器 或其他任何东西 以防止这种情况
  • 使用 XAMPP 在 Windows 10 中安装 go-pear.phar 时出错

    我在尝试安装时总是遇到错误go pear phar 这是点击后的错误Enter对这个问题1 13 all or Enter to continue 1 13 all or Enter to continue ERROR Please ent
  • 应用程序错误:故障地址0x00012afb(专家)

    我需要一些 光 来找到解决方案 可能有很多事情会导致这个问题 但也许有人可以帮助我 场景 Windows 服务器 24 7 运行 PostgreSQL 数据库和其他服务器应用程序 用于处理数据库上的任务等 有不同的服务器场景 30 具有不同
  • 如何使用 .Net (C#) 在 Windows 中安全地存储 AES 密钥?

    我一直在寻找一种方法来存储给定的 AES 密钥 以便无法检索它 但它仍然可以用于加密和解密 使用 C 我认为可以找到非对称密钥存储的等效项here http msdn microsoft com en us library tswxhw92
  • Powershell:别名和函数有什么区别?

    Im setting up my powershell profile to create aliases of commonly used commands On Microsoft s documentation https learn
  • 触摸屏模拟器:是否有任何 Windows 模拟器可以在触摸屏环境中测试应用程序

    我想在触摸屏环境中测试我的应用程序 我的应用程序是一个使用 asp net net Framework 3 5 和 flash 构建的网站 我想使用 Windows XP Vista 7 的模拟器来测试我的应用程序 请告诉我是否有 Micr
  • C++ 控制台键盘事件

    有什么方法可以获取 Windows 控制台中的关键事件吗 我需要一种无需 GUI 即可快速获取 keydown 和 keyup 事件的方法 我尝试过使用 getch 但它没有获取按键并等待按下某个键才返回 Use ReadConsoleIn
  • 在新的浏览器进程中打开 URL

    我需要在新的浏览器进程中打开 URL 当浏览器进程退出时我需要收到通知 我当前使用的代码如下 Process browser new Process browser EnableRaisingEvents true browser Star
  • phoenix 框架 - 新套接字处的参数无效 - windows

    我无法运行新的 Phoenix 应用程序 这是我收到的错误 我不确定原因是什么 我尝试更改端口 但这并没有改变行为 另外 我似乎能够正确运行节点 Compiled web views error view ex Compiled web c
  • MySQL 在 Windows 上将数据库文件存储在哪里以及文件的名称是什么?

    我不小心格式化了硬盘并重新安装了 Windows 却忘记备份 MySQL 服务器中的重要数据库 我现在正在尝试使用某些软件来挽救文件 但我不知道要寻找什么 文件存储的路径是什么 文件的名称是什么 我应该查找什么命名约定或文件扩展名 我相信我
  • Windows 卷曲批处理文件

    我想使用 Windows 批处理文件进行 mailgun 卷曲调用 由于Windows shell不支持多行 如何在Windows批处理文件中执行以下curl函数 curl s user api key xxxxxxxxxx https a
  • 当c的控制台使用c或c++运行时禁用键盘按键

    我想在程序运行时禁用键盘 这意味着没有人可以使用 alt F4 等 我如何在 Windows 操作系统中使用 c 使其成为可能 Handle WM SYSKEYUP WM SYSKEYDOWN并返回0 这是处理这些消息的 WndProc L
  • 可可消息循环? (与 Windows 消息循环相比)

    在尝试将我的游戏引擎移植到 Mac 时 我偶然发现了一个基本 但很大 的问题 在 Windows 上 我的主要代码如下所示 非常简化 PeekMessage check for windows messages switch msg mes
  • 如何在多个文件上调用动词

    我想使用 PowerShell 在多个文件上调用打印动词 在 Windows 资源管理器中 我可以进入一个文件夹 选择多个文件 右键单击并选择打印选项 这将打开 打印图片 对话框 其中包含所有选定的文件 我可以使用以下方法对一个文件执行此操
  • 为什么加载程序无法加载到所需位置

    据说有时加载器加载 exe 的地址与链接器假定的地址不同 当加载程序这样做时 可能会出现什么情况 基本上 这发生在以下情况 图像要加载的地址已被占用 例如 那里可能已经加载了另一个图像 要加载的图像已编译ASLR http en wikip
  • 命令中带空格的 Windows C 系统调用

    我无法使用名称和参数中的空格进行系统调用 例如 system c program files something example exe c my files example txt 我尝试过各种我知道的方法来逃避 但没有任何效果 我努力了

随机推荐

  • 如何在 HBase 中预分割表

    我将数据存储在具有 5 个区域服务器的 HBase 中 我使用 url 的 md5 哈希作为我的行键 目前 所有数据仅存储在一台区域服务器中 所以我想预先分割区域 以便数据在所有区域服务器上统一传输 我希望通过行键的第一个字符将表分成五个区
  • 为什么 log4Net 中没有跟踪级别?

    我只是想知道为什么没有痕迹水平 http logging apache org log4net release sdk log4net Core Level html在 log4Net 中 这个级别似乎缺失 我有时觉得需要使用它 例如输出应
  • 传单中的地图标记闪亮

    我仍然是一名 R 新手 但我已经获得了一些关注 主要是因为我正在阅读这里的所有帖子 然而 我找不到有关此的任何信息 我追求的是 当用户单击传单中的标志时 ID 我分配的 被初始化 此时我使用该 id 来查询另一个数据表以构建图表 我的问题是
  • 在我的部署中设置 Cache-Control no-cache, no-store 是什么?

    我有一个问题 我的应用程序部署总是返回响应标头 Cache Control no cache Cache Control no store Expires Thu 01 Jan 1970 00 00 00 GMT Pragma no cac
  • 使用 Airflow 中的另一个 dag 触发外部 dag

    有调用主 dag 中不同 dags 的任务列表 我正在使用 TriggerDagrunoperator 来完成此操作 但面临的问题很少 TriggerDagrunoperator 不会等待外部 dag 完成 它会触发下一个任务 我希望等到完
  • 在 React Native Android ViewManager 中暴露 Fragment

    我正在尝试将 YouTube Android API 包装为 React Native 的 UI 组件 我已经成功完成了 Android 配置 获得 onInitializationSuccess 但是我无法弄清楚如何将 YouTubePl
  • Spring中无法使用Tomcat提供的JNDI DataSource?

    我想在基于 Spring 的应用程序中使用 Tomcat 提供的 JNDI 数据源 我使用 Tomcat 7 池 尝试按照描述进行配置here https stackoverflow com questions 9183321 how to
  • 将打字稿字符串转换为布尔值

    我正在尝试将字符串转换为布尔值 有几种方法可以做到这一点 一种方法是 let input true let boolVar input true 这里的问题是我必须验证输入是否正确 除了验证第一个输入然后进行转换之外 还有其他更优雅的方法吗
  • 使用 Firebase 跟踪应用链接

    我们有 Android 和 iOS 应用程序 我们想要跟踪我们的应用程序是从哪些链接下载的 因此 如果我们在 Facebook 上发布了我们应用程序的链接 并且有人点击该链接并下载了它 它应该记录该应用程序是在 Facebook 上下载的
  • 如何选择 Windows 窗体文本框中的所有文本?

    我想选择文本框中的所有文本 我已经使用下面的代码尝试过 textBoxResults SelectionStart 0 textBoxResults SelectionLength textBoxResults Text Length 来源
  • MySql 意外停止

    MySql 意外停止 这是错误日志的副本 2019 07 03 13 27 50 0 错误 InnoDB 您的数据库可能已损坏或 您可能复制了 InnoDB 表空间 但没有复制 InnoDB 日志 文件 请参阅https mariadb c
  • 如何连接 GWT 超链接点击处理程序?

    我是 GWT 的新手 正在努力实现以下目标 这是我编写的代码 public class MyWebApp implements EntryPoint The main container for everything the user se
  • 如何将express.js服务器部署到Netlify

    我正在尝试将 Vue js Node Express MongoDB MEVN 堆栈应用程序部署到 Netlify 我成功地将应用程序的前端部署到 Netlify 现在正在尝试基于以下内容部署 Express 服务器serverless h
  • Django admin - 使所有字段只读

    我试图将所有字段设置为只读 而不明确列出它们 就像是 class CustomAdmin admin ModelAdmin def get readonly fields self request obj None if request u
  • Guava:如何结合过滤和转换?

    我有一个字符串集合 我想将其转换为全部为空或 null 的字符串集合 删除字符串并修剪所有其他字符串 我可以分两步完成 final List
  • 同一日志行上的 Java EE 重复信息

    我想将 log4j2 版本 2 17 1 与 wildfly 15 一起使用 我做了所有写的here http www mastertheboss com jbossas jboss log how to use log4j2 in you
  • Windows 8.1 如何修复这个过时的代码?

    我已将我的项目从 Windows 8 0 升级到 Windows 8 1 并收到一些过时代码的警告 其中一些我已经修复了 有些还没有 这是我无法修复且找不到任何信息的最后警告的图像 所有警告都引用相同的方法 并且它说它已过时 我应该怎么做才
  • 共享托管环境中的 sys_get_temp_dir

    注意 这也适合超级用户 我正在使用 apache2 mpm itk 和 open basedir 在共享主机上设置 PHP 5 3 10 每个用户都不能看到或更改另一个用户的文件 在 apache2 vhost 设置中 我添加了适当的条目来
  • Java - 获取当前类名?

    我想做的就是获取当前的类名 而java附加了无用的废话 1到我的班级名称的末尾 我怎样才能摆脱它并只返回实际的类名 String className this getClass getName Try String className th
  • 我是否必须在 CComPtr 对象上调用 Release() 方法?

    我正在使用 SAPI5 API 来处理文本到语音 如果我简化我的代码 如下所示 我删除了错误检查以尽可能简化它 int main CoInitialize NULL CComPtr