GDIオブジェクトの削除についての疑問

[戻る]
あやこっぽ 2001/02/15(木) 01:35:58
初心者なもので根本的な意味がわかっていないようです。
よろしくお願いします。

SetTimerを使って何度もOnDrawを呼び出し、簡単な動画にしています。
使用したGDIオブジェクト(Pen等)を、毎回きちんと削除しないと、
何度もOnDrawを呼び出すので、そのうちGDIリソースがいっぱいになっちゃって、
止まってしまいますよね。そこまではわかりました。

//GDIオブジェクトの作成
CPen penBlue (PS_SOLID,1,RGB(0,0,255));//ペンの定義、実線、太さ1、青
CPen* pPenOld = pDC->SelectObject(&penBlue);    

〜描画〜

//GDIオブジェクトの削除
pDC->SelectObject(pPenOld);
penBlue.DeleteObject();

私は上記のようにGDIオブジェクトの作成と削除を行っています。
それで何の問題も生じていないのですが、1つ疑問があります。
pPenOldは毎回削除されていないのですが、なぜそれでも良いのでしょうか?
ポインタだからですか?でもポインタもメモリも消費するんですよね。
気になってしょうがありません。よろしくお願いします。

2001/02/15(木) 09:48:27
> CPen penBlue (PS_SOLID,1,RGB(0,0,255));//ペンの定義、実線、太さ1、青
> CPen* pPenOld = pDC->SelectObject(&penBlue);

推測ですが・・・
penBlueはMFC内部で::CreatePenが呼ばれているはず。当然メモリの確保も行われている。
penBlue.DeleteObject();で、確保したメモリの解放を行う。
その為に、DeleteObjectをせずにCPenの宣言を繰り返すとメモリを浪費するのではないかと思われます。

*pPenOldではグローバルなら、その関数の終了時に破棄される為、特に削除しなくても良いのではないでしょうか。

Hal 2001/02/15(木) 18:25:14
はじめまして
Halと申します。
私の推測では、SelectObjectにより返される値は、現在設定されている
オブジェクトのポインタですのでこのオブジェクトを関数内で削除してしまうと
その後初期値として設定されているオブジェクトがなくなってしまうことになります。
よって、アプリケーション終了時に自動的に削除されるのだと思っています。
そのために、オブジェクトの入換えを行った後、再度SelectObjectを実行して
あらかじめとっておいた初期値のオブジェクトを設定していると思います。
違うかなー。

あやこっぽ 2001/02/16(金) 06:06:42
[[解決]]
重さん、Halさん、ありがとうございました。
わかったよーなわかんないよーななんとなくわかりました。助かりました。
私みたいな初心者だけじゃなく、お返事をいただいたような知識豊富な方々でも、
「〜と思います」という断定じゃない表現を使うしかない問題なのですね。
私のようなものが、いちいち気にする問題ではなかったのかもしれません。
重さんのいうよーにmfc内部でCreatePenが呼ばれたらしきものは、
DeleteObjectを忘れずに気をつけていきたいと思います。
また、Halさんが書かれたよーに、初期値のオブジェクトは初期値だからアプリ終了までなくならない。だから、初期値のオブジェクト以外は削除しなくちゃと心がけます。
それでは。

古いスレッドには追加発言できません。