C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト


■91513 / )  Re[1]: メモリリークに関して
□投稿者/ WebSurfer (1852回)-(2019/07/02(Tue) 18:32:00)
No91509 (kiku さん) に返信

質問に対する直接の回答にはなってないですが・・・

> 質問1
>  本当にフォントやラベルが解放されないことを確認する方法はないでしょうか?

System.Drawing.Font クラスなどアンマネージドリソースを保持しているクラスは、IDisposable
インターフェイスを継承して Dispose パターンを使った実装がされていて、Dispose メソッドで
アンマネージドリソースを開放できるようになっているはずです。

アンマネージドリソースは GC では解放されないので、確認するまでもなく Dispose しなければ
解放されてないはずです。

なので、IDisposable インターフェイス を継承して Dispose メソッドを実装しているクラスは全
て、そのオブジェクトが使用されなくなった時点で Dispose メソッドを呼び出すべきということ
のようです。

詳しくは、自分のブログで恐縮ですか、以下の記事を見てください。

Dispose パターン
http://surferonwww.info/BlogEngine/post/2019/05/31/dispose-pattern.aspx


> 質問2
>  解放されないことが確認できたとして、
>  ★の部分の対処は適切でしょうか? 

上で紹介した記事に書いてある通り「Dispose パターン」というものがあります。Visual Studio
で雛形を自動生成してくれますので、それを使うのがよさそうです。

自分で作るカスタムクラスの場合、マネージドリソースしか保持しない場合は Dispose パターン
の実装は不要です。必要なのはアンマネージドリソースを保持する場合のみですが、それには以下
のケースがあると思います。

(1) Dispose パターンを実装した .NET のクラスのインスタンスを保持している。

(2) クラス内でアンマネージドリソースを取得し、それを保持している。

プログラマが Dispose するのを忘れた場合でも GC は働きます。GC ではアンマネージドリソース
は開放できませんが、その際ファイナライザが呼び出されます。なので、Dispose パターンによっ
て、最悪でもファイナライザでアンマネージドリソースを開放できるようにします。

返信 編集キー/


管理者用

- Child Tree -