GDIのリソースリークについて – 固定ページ 2 – プログラミング – Home

GDIのリソースリークについて
 
通知
すべてクリア

[解決済] GDIのリソースリークについて

固定ページ 2 / 2

ロマ
 ロマ
(@ロマ)
ゲスト
結合: 18年前
投稿: 170
 

gakさんのコードを細工して

HPEN hPen = CreatePen(PS_SOLID, 5, RGB(255, 0, 0));
HGDIOBJ oldPen = SelectObject(hdc, hPen);
MoveToEx(hdc, 0, 0, 0);
LineTo(hdc, 200, 200);
int ret = DeleteObject(hPen); // ここで削除に変更
SelectObject(hdc, oldPen);
// LineTo(hdc, 200, 200);

//int ret = DeleteObject(hPen);
VERIFY(SelectObject(hdc, hPen) != NULL); //Delete済みのペンを選択する
MoveToEx(hdc, 200, 0, 0);
LineTo(hdc, 0, 200);

これでも同じでした

xpではSelect中でもDeleteObjectは有効と思います
もちろんお勧めはしません


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

うーん、DeleteObjectが成功を返す、結果は機能しないGDIオブジェクトです
というのはSelectObjectしていても削除できてしまうと言う意味みたいですねぇ。
でも、削除されたGDIObjectで描画をしても全く意味が無いと思います。
落っこちたって文句は言えないと思いますし。
偶々動いているのであれば、それを云々言ってもなぁと思います。

基本的なGDIのルールが変わったという話は聞いた事が無いので
実際の実装はどうあれ、Select状態にあるGDIObjectは削除すべきではないし、
削除する必要があるならSelect状態を解除しないといけないというのは
変わらないと思いますよ。

で、DeleteObjectで削除してしまったGDIObjectをSelect状態にして
描画した結果がどうなったとしてもそれは保証される範囲では無いと思うので
あまり意味が無いと思います。その部分は結局実装依存になるでしょうし。
現状動いていても実装方法に変更が加えられた場合、
動きが変わってしまう可能性は十分あります。
保証されていない部分の動作について議論しても意味が無いし、
提供されているAPIは保証された範囲で使用するべきだと思います。

純粋に興味で調べる分には良いと思いますけれど。
使うかどうかとは別問題です。


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

返信する

投稿者名

投稿者メールアドレス

タイトル *

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