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

时间:2012-04-19 00:15:28

标签: .net mfc c++-cli mixed-mode

我的混合模式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派生类。

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

谢谢,

2 个答案:

答案 0 :(得分:3)

  

这是预期的行为吗?

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

你必须解决这个限制。

答案 1 :(得分:1)

我相信this answers your problem

相关文字:

  

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

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

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