Windows98にてfreeをつかってもdeleteを使ってもメモリを解放してくれません。
どなたか解決策を伝授してください。お願いします。
メモリを解放しない,というのはどのようにして調べましたか?
ちなみに,freeやdelete即OSにメモリを返還,という仕様ではないです。
リソースをみながら実行したのですがXPや2000では使用メモリが一旦増えて
もとにもどっているのですが、98だと使用メモリがふえたままになってい
たからそう思ったのですが・・・
今Bitmapファイル操作のものを作成しているのですがBitmap情報を読み込み時に以下のようにメモリ確保をしています。
PBYTE m_pbmi; //メンバ変数
Alloc(const DWORD dwInfoSize)
m_pbmi = new BYTE[m_dwInfoSize];
if(!m_pbmi)
return bResult;
::ZeroMemory(m_pbmi , m_dwInfoSize);
m_pbmih = (BITMAPINFOHEADER*)m_pbmi;
その後、新しい情報ができた場合に以下のように開放し、再作成しています
::Free()
{
if(m_pbmi)
delete[] m_pbmi;
m_pbmi = NULL;
m_pbmih = NULL;
}
メモリ確保しているのがこの部分だけなので、使用メモリが減らないということは、開放されていないと判断したのですが・・・
即OSにメモリ返還するのにはどんなものがあるのでしょうか?
勉強不足で申し訳ないですが、ご教授おねがいします
YuOさんが書かれた通り、マイクロソフトのコンパイラ・ライブラリ
では、取得したメモリ領域は、freeしても即解放されません。
あくまで、プログラム終了時点で全て解放される仕組みになって
います。
リアルタイム的な取得・解放を行いたいのであれば、Win32 API
でのメモリ取得・解放を使わないと、できません。
ただし、取得・解放を相当回数行うような場合は、プログラム的
な処理速度が低下します。また、Win98の場合は、全てのメモリ領域が
1つの領域として動く構造になっていますので、使用可能メモリ領域
の分断が発生してしまいガーベージコレクションを行わせないと、
空きメモリがあっても連続領域としては取得できないので、うまく
動作させることができなくなります。
どのようなことに使われるかで、犠牲になる部分を最小限にしないと
うまく動作しないプログラムになってしまいますヨ。
以上。
ありがとうございましたー
勉強不足でガーベージコレクションが
ちょっとわからなかったのですが
なんとかやってみます
解決しているようなのですが、同等の現象がでてこまっています。
私は以下のようにCreateDIBSectionにてHBITMAPクラスを作成し
使用しているのですが、開放時はDeleteObjectを使用しメモリ開放
しているはずなのですが、98の場合のみ開放してくれません。
XP/2000では動作OKでした。
98では特別な開放の仕方もしくは、こうすれば無理にでも開放できる
というやり方があれば参考にさせていただけないでしょうか?
以下 ソース一部抜粋
class CBitmapInfo {
private:
int m_cEntries;
DWORD m_dwInfoSize;
PBYTE m_pbmi;
BITMAPINFOHEADER* m_pbmih;
public:
CBitmapInfo();
~CBitmapInfo();
VOID Alloc();
BITMAPINFO *GetBitmapInfo() const { return (BITMAPINFO*)m_pbmi; };
BITMAPINFOHEADER *GetBitmapInfoHeader() const { return (BITMAPINFOHEADER*)m_pbmih; };
〜中略〜
CBitmapInfo::Alloc(){
m_cEntries=0
DWORD dwSize = sizeof(BITMAPINFOHEADER) + (m_cEntries - 1) * sizeof(RGBQUAD) + nBitsSize;
m_dwInfoSize = dwSize;
m_pbmi = new BYTE[dwSize];
::ZeroMemory(m_pbmi , dwSize);
m_pbmih = (BITMAPINFOHEADER*)m_pbmi;
m_pbmih->biSize = sizeof(BITMAPINFOHEADER);
}
BOOL CDIBitmap::Create(const int cx , const int cy )
{
BOOL bResult = FALSE;
HBITMAP m_hBitmap;
DIBSECTION m_ds;
CBitmapInfo bmInfo;
bmInfo.Alloc(24 , 0);
BITMAPINFOHEADER* pbmih = bmInfo.GetBitmapInfoHeader();
pbmih->biWidth = cx ;
pbmih->biHeight = cy ;
pbmih->biPlanes = 1 ;
pbmih->biBitCount = 24 ;
pbmih->biCompression = BI_RGB ;
pbmih->biSizeImage = 0 ;
pbmih->biXPelsPerMeter = 0 ;
pbmih->biYPelsPerMeter = 0 ;
pbmih->biClrUsed = 0 ;
pbmih->biClrImportant = 0 ;
int i;
BITMAPINFO *pbmi = bmInfo.GetBitmapInfo();
m_hBitmap = ::CreateDIBSection(NULL , pbmi , DIB_RGB_COLORS , (void **)&m_pBits , NULL , 0);
if(!m_hBitmap){
return bResult;
}
::GetObject(m_hBitmap , sizeof(DIBSECTION) , &m_ds);
}
〜省略〜
}