1

次のコード スニペットを検討し、using句または明示的な破棄がないことを見落としています。


    public static Image GetImage(string imageName)
    {
        Image image = null;
        Stream unmanagedMemoryStream = Assembly.GetExecutingAssembly().GetManifestResourceStream(imageName);
        image = Image.FromStream(unmanagedMemoryStream);
        return image;
    }

unmanagedMemoryStreamで Dispose() が呼び出されるのはいつですか? 包含メソッドが非静的になった場合、これはどのように変化しますか? この状況でアンマネージ メモリのリークが発生する可能性はありますか?

4

2 に答える 2

5

image破棄されると、ストリームが破棄されます -Image.FromStream与えられたストリームの所有権を効果的に取得します。

特に、ここでステートメントでストリームを破棄した場合using、少なくとも一部の画像タイプでは画像が使用できなくなります。

于 2011-08-23T11:59:39.997 に答える
2

Jonの答えに加えて、メソッドを非静的に変更しても効果はありません。静的メソッドに Image ローカル変数があるという事実は、何も変更しません。これは、ヒープ上のオブジェクトへのスタック上の参照にすぎません。メソッドが終了すると、参照はスタックから削除されます。したがって、メソッドが静的であるかどうかにかかわらず、メモリ リークに関しては何も変わりません。

ここでメモリ リークが発生する可能性があるのは、イメージが破棄されておらず、ガベージ コレクションも行われていない場合です。

于 2011-08-24T09:02:33.377 に答える