混合模式 C++/CLI 应用程序未正确关闭 CLR

2023-11-29

我的混合模式 MFC 应用程序正在创建错误的内存泄漏,因为 CRT 没有时间在 MFC dll 关闭之前关闭。

我有一个非常简单的小应用程序来显示问题:

#include <windows.h>
#include <iostream>

struct LongTimeToDestroy
{
  ~LongTimeToDestroy()
  {
    std::cout << "Will get called!" << std::endl;
    Sleep(3000);
    std::cout << "Won't get called!" << std::endl;
  }
};

LongTimeToDestroy gJamsUpTheCRT;

int main()
{
}

编译用cl.exe /clr test.cpp。运行时,您将得到:

Will get called!

问题的关键是:之前声明的任何静态/全局变量gJamsUpTheCRT不会被释放。例如,在我的例子中,MFC CWinApp 派生类未清理。

这是预期的行为吗?我想让我的应用程序完全关闭。

Thanks,


这是预期的行为吗?

是的,尽管您必须阅读 CLI 规范中的细则。它承诺在程序终止时调用托管对象的终结器。但需要注意的是,执行此操作的终结器线程需要两秒钟的时间来完成工作。如果花费的时间更长,那么 CLR 就会认为出现了严重错误。就像在不会收到信号的同步对象上进行代码阻塞的常见诅咒一样。它处理的是aborting终结器线程并允许程序终止。没有诊断。

您必须解决此限制。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

混合模式 C++/CLI 应用程序未正确关闭 CLR 的相关文章

随机推荐

  • 使用 Jasper Reports API 6.13.0 和 Adopt OpenJDK 11 编译 Jasper Reports 时出错

    我们有一个实用程序 CompileJasperReports jar 用于编译文件夹中找到的所有报告 当将 JasperReports 6 7 API 与 Java 8 结合使用时 该实用程序运行良好 通话内容是 C Program Fil
  • 从 htaccess 重写规则中排除多个路径

    我创建了一个新函数 希望能够实现面包屑和更好的 URL 结构 在此之前 我有以下规则 RewriteRule pages a z0 9 action viewArticleName page identifier 1 L NC QSA B
  • 如何在发布之前邀请用户测试附加组件?

    我目前正在开发一个 Gmail 插件 希望允许我团队内部的一些用户在公开发布之前测试该插件 我正在关注文档here来自谷歌指出 您可以允许其他用户通过与其帐户共享 Apps 脚本项目 需要读取权限 来测试该加载项 然后提示用户按照上述步骤操
  • 在 github 上启用 2FA 时使用密码代替令牌

    我最近在 github 上激活了 2FA 现在我所有计算机中的所有本地存储库都停止工作 我通过 https 使用它们 看来我必须切换到 SSH 或创建个人访问令牌 我的 git 设置的配置方式是 在进行拉 推时从不要求用户名 但总是要求密码
  • 我怎样才能加速这个 Rcpp 代码?

    我在 R 中实现了一个运行时间较长的函数 我已经成功地在 R 中改进了它 但现在我想通过使用 Rcpp 包来加快它的速度 我创建了以下 Rcpp 代码 不幸的是 它的运行时间与 R 代码的运行时间大致相同 我想因此改进它 有人知道如何改进这
  • 如何将新数组插入到我的锯齿状数组中

    你好 我将非常感谢任何帮助 好吧 让我们看看 首先我声明了一个像这样的锯齿状数组和下一个代码 int n 1 m 3 p 0 int jag array new n 现在我的锯齿状数组内部将有 1 个数组 接下来必须像这样填充数组 car
  • 如何在没有显式嵌套循环的情况下生成 N 个元素的组合,每个元素的供应有限

    如果 N 是固定的 比如 N 3 那么很容易 我可以使用深度为 3 的嵌套循环 例如 from i in Enumerable Range 0 2 from j in Enumerable Range 0 2 from k in Enume
  • CodeIgniter - 检查真实结果的最佳方法

    检查模型或其他任何地方的某些方法是否正确执行的最佳方法是什么 这是个好办法吗 Model data field1 this gt input gt post field1 data field2 this gt input gt post
  • BASH 脚本根据日期复制文件,但有一个问题

    让我解释一下树结构 我有一个网络目录 我们的数据库每天会多次复制新的 txt 文件 这些文件位于基于用户名的目录中 在本地磁盘上 我具有相同的结构 基于用户名的目录 并且需要使用最新的 txt 文件进行更新 这不是同步过程 我将远程文件复制
  • 列出 C# 中的 GetRange 错误

    我正在处理列表 我的列表有 14 条记录 List
  • 用于.Net项目的文档数据库/键值存储[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心以获得指导 是否有与 Net 项目配合
  • 变量赋值避免无限循环

    我有两段递归代码 打算递归地打印出数组的一半 直到到达数组长度为 1 的数组 没有变量赋值的代码无限运行 而有变量赋值的代码则按预期运行 有任何线索说明为什么会出现这种情况吗 无限运行 CAREFUL function half arr h
  • 突出显示 DBGrid 中的特定文本

    我正在执行查询并在 dbgrid 中显示返回的数据 我想突出显示符合搜索条件的项目 就像是 搜索方式 test 在 DBGrid 中 返回的数据将为 ID Return 1 This is a test 2 Test ing 这里的目标无疑
  • 如何确定 SharePoint 列表的磁盘大小?

    我有一个包含大约 5500 个项目的列表 我想了解磁盘上的大小 我有什么办法可以做到这一点吗 如有必要 我不介意在数据库中运行查询 导航http myapplication mySitecollection layouts storman
  • 类型 将指数数转换为 int 或 float

    下面的代码 echo int 2e2 echo int 2e2 echo float 2e2 outputs 2 200 200 我不知道为什么 谢谢 2e2 is scientific notation meaning 2 102 200
  • 使用 invalidateOptionsMenu() 打开/关闭 NavDrawer 会导致 SearchView 上的 onRestore 调用和 onQueryTextChange 也被调用

    我有一个带有回调实现的 MainActivity DrawerListFragment Callback ItemListFragment Callbacks SearchView OnQueryTextListener 我还添加了一个 A
  • 我对drawable-hdpi 和drawable-mdpi 感到困惑

    我正在尝试让我的 Android 应用程序在手机类型设备和平板电脑上运行 对于布局 我有layout normal和layout large 并且我将xml文件放入每个布局中 似乎为每个设备选择了正确的布局 手机的layout normal
  • 芹菜组和链

    我需要对 Celery 中的一些任务进行排序 其中一些应该作为单个任务 一些应该并行工作 当组中的任务完成时 它应该传递下一个任务 chain task1 s task2 s group task3 s task4 s group task
  • 在C中反转单​​链表[重复]

    这个问题在这里已经有答案了 可能的重复 如何仅使用两个指针反转单链表 这是反转链表的 C 代码 但这并没有产生所需的输出 struct node temp prev while head gt next NULL temp prev hea
  • 混合模式 C++/CLI 应用程序未正确关闭 CLR

    我的混合模式 MFC 应用程序正在创建错误的内存泄漏 因为 CRT 没有时间在 MFC dll 关闭之前关闭 我有一个非常简单的小应用程序来显示问题 include