我的混合模式 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(使用前将#替换为@)