MFC dllがシャットダウンされる前にCRTにシャットダウンする時間がないため、混在モードのMFCアプリケーションで誤ったメモリリークが発生しています。混在モードのC++/CLIアプリケーションでCLRが正しくシャットダウンされない
私は問題を示し、非常に単純な小さなアプリケーションがあります。
#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派生クラスはクリーンアップされません。
これが期待どおりの動作ですか?私は私のアプリケーションが完全にシャットダウンすることを許可したいと思います。
おかげで、
Porgesのリンクで提供されているJoe Duffyリンクは、「設定は可能ですが、デフォルトではCLRによってファイナライザが2秒間実行される」と述べています。あなたはこれを設定する方法を知っていますか? – Cechner
いいえ、おそらくあなた自身がCLRをホストする以外の方法ではありません。現実的には、ファイナライザーが既に50億cpuのサイクルを焼いていて、仕事をやり遂げなかったときに、もう少し追加することで救済する可能性はあまりありません。 –