混合模式C ++ / CLI应用没有正确关闭CLR(Mixed-mode C++/CLI app n

2019-06-23 18:11发布

我的混合模式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派生类是没有清理。

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

谢谢,

Answer 1:

这是预期的行为?

是的,虽然你读的CLI规范小字。 其承诺,对管理对象的终结程序终止时被调用。 但需要提醒的是终结器线程,这是否得到两秒钟完成这项工作。 如果需要更长的时间,则CLR假定有一些明显错误。 这样是不是会得到信号同步对象在具有码阻塞的常见的诅咒。 它与通过中止终结器线程并允许程序终止交易。 没有诊断。

你必须解决此限制。



Answer 2:

我相信这回答你的问题 。

相关的文字:

尽管配置,默认情况下CLR会让终结了越来越不耐烦2秒之前的运行; 如果超过此超时,终结器线程被停止,并继续关闭不消耗终结队列中的其余部分。

所以,你真的不应该执行,将采取时间任务的任何析构函数。

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



文章来源: Mixed-mode C++/CLI app not shutting down CLR correctly