6

以下のシナリオでメモリ リークが発生するかどうかを知りたいです。

Aspx ページには以下が含まれます。

private void Generator(input)
{
    using (MemoryStream memoryStream = Helper.Instance.Generate(input))
    {
    }
}

以下のメソッドは、メモリ ストリームを返す aspx ページから呼び出されます。

MemoryStream Generate(input)
{
    MemoryStream stream = new MemoryStream();
    //doing some stream manipulation here

    return stream;
}
4

4 に答える 4

10
  • 最初のポイント: コードによって例外がスローされた場合:

    // doing some stream manipulation here
    

    その場合、MemoryStream は によって返されHelper.Instance.Generateないため、呼び出し元によって破棄されません。

  • 2 番目のポイント:MemoryStream管理されていないリソースを使用しないため、 を呼び出す必要はありませんDispose

したがって、この場合、メモリ リークは発生しません。

Helper.Instance.Generate次のように例外がスローされた場合は、Dispose を強制する方が間違いなく優れています。

MemoryStream Generate(input)  
{      
    MemoryStream stream = new MemoryStream();      

    try
    {
        //doing some stream manipulation here        

        return stream;  
    }
    catch
    {
        stream.Dispose();
        throw;
    }
}  

IDisposableこれは、オブジェクトを構築、操作、および返すメソッドの一般的なパターンです。

于 2012-09-18T12:24:48.817 に答える
0

Dispose メソッドは us​​ing ブロックを終了した後に呼び出されるため、これは完全に有効であり、メモリ リークは発生しません。

次のことを行うのとまったく同じです。

 private void Generator(input)
 {
    using (MemoryStream memoryStream = new MemoryStream())
    {
        Helper.Instance.Manipulate(memoryStream);
    }
 }
于 2012-09-18T12:18:21.050 に答える
0

MemoryStream、 、 ...のようなものでも一貫して破棄することには価値があると思いますDataTable。これにより、コードが読みやすくなり、正しいことを確認しやすくなります。-blockにリソースが表示されている場合usingは、それが正しいことがすぐにわかります。頭の中でメンタル フロー トレースや実行のシミュレーションを行う必要はありません。

コードが正しいことをすぐに確認できます。何も考えずに。それはいいと思います。

とはいえ、余計なものもブロックに入れようとはしusingますが、無理はしません。破棄しない理由がある場合 (開発者の都合であっても)、破棄しません。

于 2012-09-18T12:39:07.147 に答える
0

@Joeはすでにいくつかの説明を提供しています。IDisposable を実装するオブジェクトの場合、できるだけ早く Dispose を呼び出してリソース (マネージドおよび/またはアンマネージド) を再利用できますが、CLR はそれらを引き続き追跡し、ファイナライザーを介してリソースを再利用するため、呼び出さないこともできます。ファイナライザーを使用してリソースを解放すると、時間がかかりますが、メモリ リークの発生を防ぐことができます。

オブジェクト/クラスを実装する人が設計ガイドラインに従わず、ファイナライザーを適切に記述するのを忘れた場合にのみ、メモリ リークが発生します。

詳細について言及している記事や本はたくさんあります。

http://msdn.microsoft.com/en-us/magazine/cc163392.aspx

http://www.bluebytesoftware.com/blog/PermaLink.aspx?guid=88e62cdf-5919-4ac7-bc33-20c06ae539ae

于 2012-09-18T12:52:03.997 に答える