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割り当て解除されません。たとえば、私の場合、MFCCWinAppから派生したクラスはクリーンアップされません。

これは予想される動作ですか?アプリを完全にシャットダウンさせたいのですが。

ありがとう、

4

2 に答える 2

3

これは予想される動作ですか?

はい。ただし、CLI仕様の詳細を読む必要があります。これは、プログラムの終了時に管理対象オブジェクトのファイナライザーが呼び出されることを約束します。ただし、これを実行するファイナライザスレッドは、ジョブを完了するのに2秒かかることに注意してください。それよりも時間がかかる場合、CLRは何かが大幅に間違っていると想定します。シグナルを受け取らない同期オブジェクトでコードをブロックするという一般的な呪いのように。ファイナライザースレッドを中止し、プログラムを終了できるようにすることで、これを処理します。診断なし。

この制限を回避する必要があります。

于 2012-04-19T00:31:17.230 に答える
1

私はこれがあなたの問題に答えると信じています

関連するテキスト:

構成可能ですが、デフォルトでは、CLRはファイナライザーを2秒間実行させてから、焦ります。このタイムアウトを超えると、ファイナライザスレッドが停止し、残りのファイナライザキューを空にすることなくシャットダウンが続行されます。

したがって、時間のかかるタスクを実行するデストラクタを実際に配置するべきではありません。

編集:実際には、それはCLRクラスではないので、ファイナライズキューに入れるべきではありませんか?これは誤解を招く可能性があります。

于 2012-04-19T00:26:52.723 に答える