LoginSignup
24
30

More than 5 years have passed since last update.

.Netのformでメモリリーク(解放できないという問題)

Posted at

.Netのformでメモリリーク(解放できないという問題)

C# .Netでオリジナルのメッセージボックスを作り、usingで囲んでnew form()をして、showDialogするだけ、という単純なものを使っていたところ、メモリ使用量が増えていく現象が不思議で仕方ありませんでした。
結論からいうと、

Control クラス(を継承するクラス)は特別で、特別なところから参照されています。
null(VB なら Nothing)を代入しても解放されません。

ということがMSDNに記載されていました。
回避方法はformオブジェクトの再利用しかないということで、

何度も表示/非表示を繰り返すなら、new - Show - Close ではなく、
Visible プロパティを操作することを勧めます。
また、ShowDialog を使う場合は、new - ShowDialog - Close - Dispose とするのではなく、
ShowDialog - Close を繰り返します。

new~Dispose を繰り返すと、リークはしませんが、メモリの確保量は
(実験されているように)大きくなるので、パフォーマンスに影響が出ると思われます。
再生ではなく、再利用することを勧めます。
ということで、厳密な名称についてメモリリークではないが、メモリが解放されないので正式な名称こそページ内に出てきませんが、メモリを解放する能力が無いという点でメモリリークと何が違うのかわかりませんが、利用者からは同じ現象に見えます。

[リンク]https://social.msdn.microsoft.com/Forums/ja-JP/9a19f648-a849-4090-a05e-e6ffccdc2adc?forum=csharpgeneralja

再利用ということで、staticでformオブジェクトを確保しておき、利用時の初期化用の関数を用意するしかなさそうでした。
実際、そのようにすると嘘のようにメモリの増加が無くなりました・・・

24
30
8

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
24
30