4

Winform OpenFileDialog、開くたびにメモリが増加し、dispose () と OpenFileDialog = null が機能しませんが、メモリは失われません。.

これを修正する方法??

   private void btnLocalPicture_Click(object sender, EventArgs e)
    {
        OpenFileDialog ofdSelectPicture = new OpenFileDialog();
        ofdSelectPicture.Filter = "PicFile|*.jpg;*.png;*.jpeg;*.gif;*.bmp;*.tif";
        if (ofdSelectPicture.ShowDialog() == DialogResult.OK)
        {
            if (showPicture != null)
                showPicture.Dispose();
            showPicture = Image.FromFile(ofdSelectPicture.FileName);
            if (pbShowPicture.Image != null)
                pbShowPicture.Image.Dispose();
            pbShowPicture.Image = showPicture;
            path = ofdSelectPicture.FileName;
            WordTip.Visible = false;
            if (pbShowPicture.Image != null)
                picOK.Enabled = true;
        }
        ofdSelectPicture.Dispose(); //not working
        ofdSelectPicture = null;  //not working
        GC.Collect();
    }
4

1 に答える 1

7

Project + Properties の [Debug] タブで何が起こっているかを確認できます。[Enable unmanaged debugging] オプションにチェックを入れます。プログラムを起動し、[出力] ウィンドウを選択します。ダイアログを表示します。

プロセスにロードされる DLL のリストが表示されます。これらは、マシンに登録されているシェル拡張です。正確に何が得られるかは予測できません。誰もが自分のお気に入りの拡張機能のセットを持っています。プログラマーはそれらの多くを持っている傾向があります。

はい、これらの拡張機能はプロセスでメモリを消費します。これらの DLL が仮想メモリ アドレス空間のスペースを占有しているという事実だけで。しかし、これらの DLL が独自に使用するためにメモリを割り当てるためでもあります。そして、書き方が悪いと、確かにメモリ リークが発生する可能性があります。これらの拡張機能によって割り当てられるメモリは常にアンマネージ メモリであることに注意してください。そのため、リークを表示する優れたツールがあることを確認してください。TaskMgr.exe のようなものでは十分ではありません。

それについてあなたができる2つの基本的なこと。最初は無視することです。この問題はマシンに固有のものであり、ユーザーには同じ問題はありません。リークを修正することはできません。拡張機能のソース コードがありません。または、SysInternals の AutoRuns ユーティリティを使用してトラブルメーカーを追跡することもできます。登録されているシェル拡張が表示され、チェックボックスをクリックして登録を解除できます。

于 2012-07-29T13:12:54.960 に答える