CreateDIBSectionで用いたBITMAPINFO構造体へのポインタの処理について

解決


どらちん  2010-11-21 20:25:10  No: 72068

こんにちは。
Windows XP SP3 + VC++ 2008(VS Team System 2008 Developer Edition)で、Win32SDKで開発をしています。

CreateDIBSection関数についてお聞きしたいのですが・・・
この中でBit Dataを格納するバッファに関しては、DeleteObjectで解放する事になっていますよね?

例えばなのですが、モノクロや4bitカラーのように、カラーテーブルが必要なDIBを作成する場合、

BITMAPINFO *pbmi = NULL;
pbmi = (BITMAPINFO)malloc(sizeof(BITMAPINFOHEADER) + 階調数 * sizeof(RGBQUAD));

というように、カラーテーブル分の領域を追加してバッファを確保すると思うのですが、これをCreateDIBSectionで利用した場合、pbmiはDeleteObject解放されるのでしょうか?
それとも、DeleteObjectの後で個別にdeleteしなければならないのでしょうか?

ご存じの方いらっしゃいましたらご教授いただけないでしょうか?
よろしくお願いいたします。


gak  2010-11-25 03:08:02  No: 72069

> これをCreateDIBSectionで利用した場合、pbmiはDeleteObject解放されるのでしょうか?
pbmiは開放されない。自分で開放する必要が有る。
というか、pbmiのコピーを DIBSection は(内部で)持ってるので、CreateDIBSection() を呼んだ直後に pbmi は開放しちまって良い。

…ハズ。
# 公式にコレに関して具体的に書いている情報は知らないが、CreateDIBSection() に渡した BITMAPINFO の生き死にを
# CreateDIBSection() 側で管理されると色々問題が有る。
# BITMAPINFO がstackに取られた自動変数だった場合、スコープを抜けると勝手に開放されちゃうのにどうするの?等。


どらちん  2010-11-25 18:36:55  No: 72070

gakさん
ご返答、ありがとうございます。

試しに、

>CreateDIBSection() を呼んだ直後に pbmi は開放しちまって良い。

をやってみました。
大丈夫そうですね☆

たいしたことではないのかもしれませんが、DIBSectionを作っては消す処理を繰り返すアプリを作っていてちょっと気になって・・・^^;

これですっきりしました!
ありがとうございました!


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加