トラブル内容
WindowsAPIを利用したC++自作ソフトを起動後、10分ぐらい放置するとスタティックコントロールの色が乱れ始めた。
原因
色塗りを行うために、CreateSolidBrush関数でブラシを作成していたが、ブラシ作成後削除していなかった。
ソフトは定期的に色塗りを自動で行うようにしており、ブラシ作成 → 未削除 が繰り返し発生したため、ブラシが大量に残った。
これによって、GDIオブジェクトが大量に生成され、オブジェクトの枯渇によってスタティックコントロールの色が乱れ始めた。
int Coloring(){
HBRUSH BrushYellow;
BrushYellow = CreateSolidBrush(RGB(255, 242, 0)); //黄色のブラシを作成
// 色塗りを実施(省略)
}
最初は問題ないにもかかわらず、ある時点から描画が乱れるという場合には、WindowsのGDIオブジェクトが大量に消費されて枯渇している可能性がある。
<正常時のタスクマネージャーの状態 GDIオブジェクト数:159>
<異常時のタスクマネージャーの状態 GDIオブジェクト数:9999>
対策内容
①色塗り実施後に、DeleteObject関数でブラシを削除する。
int Coloring(){
HBRUSH BrushYellow;
BrushYellow = CreateSolidBrush(RGB(255, 242, 0)); //黄色のブラシを作成
// 色塗りを実施(省略)
DeleteObject(BrushYellow);
}
②必要なブラシは事前に作成し、以降、ブラシを作成しないような作りに変更する。
具体的には、ブラシの作成はソフト起動時のみ、ブラシの削除はソフト終了時に実施するように変更する。
参考