CreateSolidBrushによるリソースリーク – 固定ページ 2 – プログラミング – Home

通知
すべてクリア

[解決済] CreateSolidBrushによるリソースリーク

固定ページ 2 / 2

vcshoshinsha
 vcshoshinsha
(@vcshoshinsha)
ゲスト
結合: 15年前
投稿: 11
Topic starter  

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ずつ増えていくのも確かです。

ですので、なにか失敗しているのでは、となったと思います。


返信引用
PATIO
(@patio)
Famed Member
結合: 3年前
投稿: 2660
 

メモリが増えて行くと言うのは何で確認していますか?

メモリは延々と増え続けますか?

OSから見たメモリの開放とアプリから見たメモリ開放は
必ずしも等価では有りませんが、その点に関しては理解されていますか?
プログラム的には開放していてもアプリケーション的にリザーブして
いるケースがあると思います。
この場合は、ある程度以上はメモリの使用量は増えていかないはずなので
動作としては正常です。
特にタスクマネージャで確認していたりするとその部分に関しては
考慮せずに使用メモリを表示したと思うので宛にならない事があります。

ハンドルが開放されていなくてハンドルがリークしているのと
上記の現象は別になるのでその辺は分けて考える必要があると思います。


返信引用
vcshoshinsha
 vcshoshinsha
(@vcshoshinsha)
ゲスト
結合: 15年前
投稿: 11
Topic starter  

タスクマネージャで確認していました。
2,3sで4k増えていっていました。

他に見る方法がわからなかったのでタスクマネージャで確認していましたが、
もう少し長時間でどうなるか確認してみようと思います。


返信引用
subaru
 subaru
(@subaru)
ゲスト
結合: 19年前
投稿: 381
 

>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がローカル変数になっているのでリークしますよ。


返信引用
vcshoshinsha
 vcshoshinsha
(@vcshoshinsha)
ゲスト
結合: 15年前
投稿: 11
Topic starter  

間違えていました。

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;
}

メンバ変数にしたところ、明らかにメモリの増加がなくなりました。
一瞬増加したときもありましたが、先ほどのペースで考えると全く増加していないよう
に見えます。(タスクマネージャレベルですが)

解決したように見えます。
もう少し、長時間あとまで放置し、どうなるか確認してみます。

ありがとうございます。


返信引用
ryo
 ryo
(@ryo)
ゲスト
結合: 23年前
投稿: 252
 

おまけ

GDIオブジェクトの生成・解放の確認するなら
タスクマネージャのメモリの状況よりも、「GDIオブジェクト」をみたほうがいいよ


返信引用
vcshoshinsha
 vcshoshinsha
(@vcshoshinsha)
ゲスト
結合: 15年前
投稿: 11
Topic starter  

>GDIオブジェクトの生成・解放の確認するなら
>タスクマネージャのメモリの状況よりも、「GDIオブジェクト」をみたほうがいいよ

了解しました。
ありがとうございました。


返信引用
vcshoshinsha
 vcshoshinsha
(@vcshoshinsha)
ゲスト
結合: 15年前
投稿: 11
Topic starter  

今朝までのランニングテストではタスクマネジャー上ですが12kほど増えていましたが、
GDIオブジェクト数は増えてはいませんでした。

おそらく上記処理で問題なくいけたと思います。
いろいろご教授いただいた方、ありがとうございました。


返信引用
固定ページ 2 / 2

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました