1

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

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

#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 派生类没有被清理。

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

谢谢,

4

2 回答 2

3

这是预期的行为吗?

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

您必须解决此限制。

于 2012-04-19T00:31:17.230 回答
1

我相信这回答了你的问题

相关文字:

虽然可配置,但默认情况下,CLR 会让终结器运行 2 秒,然后变得不耐烦;如果超过此超时,终结器线程将停止,并继续关闭而不耗尽终结器队列的其余部分。

所以你真的不应该让任何析构函数执行需要时间的任务。

编辑:实际上,这不是 CLR 类,所以它不应该在终结队列中?这可能具有误导性。

于 2012-04-19T00:26:52.723 回答