Windows98でメモリ解放

解決


あがし  2003-07-01 13:00:39  No: 51628  IP: [192.*.*.*]

Windows98にてfreeをつかってもdeleteを使ってもメモリを解放してくれません。
どなたか解決策を伝授してください。お願いします。

編集 削除
YuO  2003-07-01 13:34:58  No: 51629  IP: [192.*.*.*]

メモリを解放しない,というのはどのようにして調べましたか?
ちなみに,freeやdelete即OSにメモリを返還,という仕様ではないです。

編集 削除
あがし  2003-07-01 13:48:36  No: 51630  IP: [192.*.*.*]

リソースをみながら実行したのですが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にメモリ返還するのにはどんなものがあるのでしょうか?
勉強不足で申し訳ないですが、ご教授おねがいします

編集 削除
岡田 之仁  2003-07-01 13:52:25  No: 51631  IP: [192.*.*.*]

YuOさんが書かれた通り、マイクロソフトのコンパイラ・ライブラリ
では、取得したメモリ領域は、freeしても即解放されません。
あくまで、プログラム終了時点で全て解放される仕組みになって
います。

リアルタイム的な取得・解放を行いたいのであれば、Win32 API
でのメモリ取得・解放を使わないと、できません。

ただし、取得・解放を相当回数行うような場合は、プログラム的
な処理速度が低下します。また、Win98の場合は、全てのメモリ領域が
1つの領域として動く構造になっていますので、使用可能メモリ領域
の分断が発生してしまいガーベージコレクションを行わせないと、
空きメモリがあっても連続領域としては取得できないので、うまく
動作させることができなくなります。

どのようなことに使われるかで、犠牲になる部分を最小限にしないと
うまく動作しないプログラムになってしまいますヨ。

以上。

編集 削除
あがし  2003-07-01 20:39:29  No: 51632  IP: [192.*.*.*]

ありがとうございましたー

勉強不足でガーベージコレクションが
ちょっとわからなかったのですが
なんとかやってみます

編集 削除
ちゅん  2003-07-03 15:40:45  No: 51633  IP: [192.*.*.*]

解決しているようなのですが、同等の現象がでてこまっています。
私は以下のように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);

  }
  〜省略〜
}

編集 削除