今Bitmapファイルを操作するものを作っているのですが、
98で実行するとメモリを開放してくれないという現象に悩んでいます
デバックの結果CreateDIBSectionで作成したHBITMAPクラスを
DeleteObjectにて削除しているのですが、DeleteObject後も
システムリソースでの確認ですが、減少せず増えたままになっています
ちなみにコードは以下のように記載しているのですが、XP/2000では
きちんと動作していました。
98でのみメモリの開放をおこなってくれないのは何かやるべきことが抜けている
のしょうか?
HBITMAP m_hBitmap;
BITMAPINFO *pbmi;
BYTE* m_pBits;
CBitmapInfo bmInfo;
~中略~
//生成
m_hBitmap = ::CreateDIBSection(NULL , pbmi , DIB_RGB_COLORS , (void **)
&m_pBits , NULL , 0);
~中略~
//開放
if(m_hBitmap)
::DeleteObject(m_hBitmap);
m_hBitmap = NULL;
s/開放/解放/g
提示されたコード片には、特に問題無さそうです。
他にチェックするべき点は
・DeleteObject() を必ず通過しているか
・m_hBitmap をどこかのDCに SelectObject() しっぱなしにしていないか
くらいでしょうか。
早速のお返事ありがとうございます
もしSelectObject()しっぱなしの場合でDeleteObjectした場合、
XP/2000では開放してくれるのでしょうか?
XP/2000では動作したので、SelectObject()部分は大丈夫だと
判断してしまっていました。チェックしてみます。
以前、win98でアプリを作っていた時、リソースメータ(でしたっけ?)で
DIBの開放を確認しようとしたのですが、使用メモリは減りませんでした。
MDSNのサンプルの読み込み部分をそのまんまコピーしてきた様なプログラム
だったのですが。
でも、連続していろいろなBMPファイルを読み込み、開放を繰り返しても
メモリ使用量がどんどん増えていくことはありませんでした。
(若干増えることはありましたが、リニアに上澄みされていっている
様子はありませんでした。)
で、リソースメータってそういうものなのかなあと思い、無視していました。
後にwin2000で同じプログラム(リビルドはしたかも)をタスクマネージャで
みるとちゃんと減っていましたので、絶対開放している自信があれば、
気にしなくてもいいのかもしれません。
(でも、自信も確証もありませんが)
Win95,98,Me と WinNT,2K,xp とは同じ Win32 API が使えますがそれだけの事です
(片方にしかない API もあれば、動作が異なるものもあるが、ほぼ同様に使えるものが多い)
とくに、Win95 の仲間は 16bit アプリケーションの動作で問題があまり起きないように
配慮しているためなのかまたはメモリー周(まわ)りの実装が異なっているためなのか
どうかは分りませんが、リソースメーターではメモリーやリソースやを解放した事が直ち
には反映しないようです。Win96 系列ではアプリケーションが終了してもメモリーや
リソースが減らないようだと問題だと判断するようにしています
ちゅんさん、開放と解放とが違うことはわかりますね?
一度注意されているのですから気をつけましょうね