HBRUSH CDIODlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH w_hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: ここで DC の属性を変更してください。
bool bRes;
bRes = DeleteObject( w_hbr );
w_hbr = (HBRUSH)::CreateSolidBrush(m_color);
return w_hbr;
}
この段階で、
bRes = DeleteObject( w_hbr )自体trueが帰ってきていたので、成功していました。
ただ、メモリはゆっくり4kずつ増えていくのも確かです。
ですので、なにか失敗しているのでは、となったと思います。
メモリが増えて行くと言うのは何で確認していますか?
メモリは延々と増え続けますか?
OSから見たメモリの開放とアプリから見たメモリ開放は
必ずしも等価では有りませんが、その点に関しては理解されていますか?
プログラム的には開放していてもアプリケーション的にリザーブして
いるケースがあると思います。
この場合は、ある程度以上はメモリの使用量は増えていかないはずなので
動作としては正常です。
特にタスクマネージャで確認していたりするとその部分に関しては
考慮せずに使用メモリを表示したと思うので宛にならない事があります。
ハンドルが開放されていなくてハンドルがリークしているのと
上記の現象は別になるのでその辺は分けて考える必要があると思います。
タスクマネージャで確認していました。
2,3sで4k増えていっていました。
他に見る方法がわからなかったのでタスクマネージャで確認していましたが、
もう少し長時間でどうなるか確認してみようと思います。
>HBRUSH CDIODlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
>{
> HBRUSH w_hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
>
> // TODO: ここで DC の属性を変更してください。
> bool bRes;
>
> bRes = DeleteObject( w_hbr );
> w_hbr = (HBRUSH)::CreateSolidBrush(m_color);
>
> return w_hbr;
>}
入力ミスなのかもしれないけど上記コードでは
w_hbrがローカル変数になっているのでリークしますよ。
間違えていました。
HBRUSH CDIODlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH w_hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
// TODO: ここで DC の属性を変更してください。
bool bRes;
bRes = DeleteObject( m_hbr );
m_hbr = (HBRUSH)::CreateSolidBrush(m_color);
w_hbr = m_hbr;
return w_hbr;
}
メンバ変数にしたところ、明らかにメモリの増加がなくなりました。
一瞬増加したときもありましたが、先ほどのペースで考えると全く増加していないよう
に見えます。(タスクマネージャレベルですが)
解決したように見えます。
もう少し、長時間あとまで放置し、どうなるか確認してみます。
ありがとうございます。
おまけ
GDIオブジェクトの生成・解放の確認するなら
タスクマネージャのメモリの状況よりも、「GDIオブジェクト」をみたほうがいいよ
>GDIオブジェクトの生成・解放の確認するなら
>タスクマネージャのメモリの状況よりも、「GDIオブジェクト」をみたほうがいいよ
了解しました。
ありがとうございました。
今朝までのランニングテストではタスクマネジャー上ですが12kほど増えていましたが、
GDIオブジェクト数は増えてはいませんでした。
おそらく上記処理で問題なくいけたと思います。
いろいろご教授いただいた方、ありがとうございました。