HDC hDC;
HBRUSH hBrush, hBrushOld;
hDC = GetDC(hWnd);
hBrush = CreateSolidBrush(123); //新ブラシ作成
hBrushOld = SelectObject(hDC, hBurush); //新ブラシ適用
使い終わる
SelectObject(hDC, hBrushOld); //旧ブラシに戻す
DeleteObject(hBrush); //ブラシ削除
ReleaseDC(hWnd, hDC);
これは
HDC hDC;
HBRUSH hBrush;
hDC = GetDC(hWnd);
hBrush = CreateSolidBrush(123); //新ブラシ作成
SelectObject(hDC, hBurush); //新ブラシ適用
使い終わる
ReleaseDC(hWnd, hDC); //先にHDCを消す
DeleteObject(hBrush); //ブラシ削除
としてもいいですか?
そこまで突っ込む理由が解りませんが・・
とりあえず、駄目です
メモリリークしますね
>ReleaseDC(hWnd, hDC); //ここでhBrushが解放されます
そして、デバイスコンテキストが最初から持っていたブラシが解放されずに残ります
・・違ったかな(^^;
しかも、
誤)メモリーリーク
正)リソースリーク
というよりもこれ以上は、自分で考えましょう(^^;
ほんとに問題が起こるかは実際に試してみないとわかりませんね。
Windows9x系で100万回くらい描画してみてリソース残量を確認してみると
いいのでは。
NT系だと問題が発覚しにくいので9x系で。
>ほんとに問題が起こるかは実際に試してみないとわかりませんね。
>Windows9x系で100万回くらい描画してみてリソース残量を確認してみると
>いいのでは。
>NT系だと問題が発覚しにくいので9x系で。
9x系とNT系では、GDIの挙動が異なる為、
9x系で大丈夫だからと言ってNT系で大丈夫と一概には、言えませんよ
EIJIさんの考えでは、下のソースで問題なさそう
といことですか?
>9x系で大丈夫だからと言ってNT系で大丈夫と一概には、言えませんよ
そうですね。両方で試したほうがよいでしょうね。
ただ、ブラシの開放忘れが起きて問題になるのなら、
9x系のほうがすぐわかるだろうと思います。
この手のバグはNT系だと発覚しにくいです。
実際にやってみるのが一番だと思いますけど、
個人的には後者のような書き方はしません。
問題があるかどうかは別に、前者のように書くべきだと思いますよ。
実験して不具合が発生しても、僕に分かるのは下のソースはだめだと
いうことだけで、僕にはそのだめな原因が分からないと思うんです。
僕にはソースのどこにエラーがあるのか分かりません。
どこがいけないのか、このままだとどうなってしまう
可能性があるのか教えてください。
うーん
>実験して不具合が発生しても、僕に分かるのは下のソースはだめだと
>いうことだけで、僕にはそのだめな原因が分からないと思うんです。
だめだと分かったら前者のような書き方をしましょう
>僕にはソースのどこにエラーがあるのか分かりません。
自分で分かるまで自分でWebや本で勉強して下さい
>どこがいけないのか、このままだとどうなってしまう
>可能性があるのか教えてください。
アプリかOSが落ちる可能性がある
ところで、原因を調べてどうするつもりですか?
納得いくかどうかは、分かりませんが・・
前者にする理由は、OS(API)の仕様だからです
以下は、MSDNの API SelectObject の解説です
この関数は、指定されたのと同じタイプで、それまで選択されていたオブジェクトを返します。
アプリケーションは新しいオブジェクトを使い終えたら、必ず元の(既定)オブジェクトに置き
換えるべきです。
えと、問題は確実に起こりませんか・・?
後者だと、hBrushは、最後にDeleteしますよね?つまりhBrushによって
指し示されたBrushの実体はメモリ上から(論理的に)なくなり、そのメモリは
フリーになるわけです。
でも、hDCは存在しつづけますし、Brushを使う必要が出たら、hBrushを
使おうとするわけです。でも実際にはもう存在しないと。
かなり簡単に問題が発覚しそうな気が・・・。
後者でも問題無ありません。
以下で証明されます。
int i;
bool b;
char buf[10];
i = ReleaseDC(hWnd, hDC);
b = DeleteObject(hBrush);
wsprintf(buf, %d, %d, i, (int)b);
MessageBox(hWnd, buf, ReleaseDC, DeleteObject, MB_OK);