メモリ使用量が減らない

[戻る]
roccy 2003/10/03(金) 00:22:59
アプリを起動してある処理をしたあと、処理が終わっても
タスクマネージャのパフォーマンスのメモリ使用量が元に戻りません。
アプリを終了させると、メモリ使用量は、減って元に戻ります。

ある処理とは、
メモリのnew等の処理です。
ただし、Debugモードの場合は、ある処理が終われば、
メモリの使用量は、元の量に戻ります。
Releaseモードの場合のみ、この現象が発生します。
何か心当たりのある方、教えてください。

<ある処理>
・あるクラスのメンバ
CTypedPtrArray< CPtrArray, CStringArray*> m_Data;
・あるクラスの関数
void Caaa::ある処理()
{
 CStringArray* pNewRecord = new CStringArray;
 CString strField;
 int Cnt = 0;
 while( 10 > Cnt )
 {
  strField = "abc";
  pNewRecord->Add( strField );
  Cnt++;
 }
 m_Data.Add( pNewRecord );
}

・あるクラスのデストラクタ内での処理(ある処理が終わるときに呼ばれる)
for( int idx = 0; idx < m_Data.GetSize(); idx++ )
{
 delete m_Data[ idx ];
 m_Data[ idx ]=NULL;
}
m_Data.RemoveAll();

・開発環境
VC++6.0
Windows2000
MFC
で開発しています。

アイススケーター 2003/10/03(金) 07:50:14
クラスのデストラクタでdeleteしなくてはならないのはpNewRecordでは?
おまけに、ローカル変数ではなくクラス内の変数にしなくちゃなららいのではないでしょうか

みつるぎ 2003/10/03(金) 08:57:41
newで作ったオブジェクトはdeleteと対に
しないとリークしますよ。

ちなみにm_Dataはメンバ変数なので
生存期間はそのクラスのオブジェクトに
依存します。

επιστημη [HomePage] 2003/10/03(金) 09:33:01
アイススケーターさん、みつるぎさん、論点がおかしい。

> ただし、Debugモードの場合は、ある処理が終われば、
> メモリの使用量は、元の量に戻ります。
> Releaseモードの場合のみ、この現象が発生します。

を説明できていません。

愚暗 2003/10/03(金) 16:30:54
正確な表現ではないかもしれませんが、
・delete でメモリを解放しても、すぐに OS に返却
 しなければならないという訳ではない。(処理系依存)
・DEBUG 環境では delete したメモリがすぐに OS に
 返却される実装になっている。
ということではないでしょうか?

#ifdef _DEBUG
#define new DEBUG_NEW
をコメントアウトしたら, DEBUG 環境でもメモリ使用量は
元の値に戻らないかもしれません。

roccy 2003/10/07(火) 23:58:32
皆さん、ありがとうございます。

>正確な表現ではないかもしれませんが、
>・delete でメモリを解放しても、すぐに OS に返却
> しなければならないという訳ではない。(処理系依存)
私もそれは、そうかなと思い、ずっと待ってましたが、
減ることはありませんでした。
そこで、メモリ解放はされていると仮定し、OSに返却
されてないけど、このメモリを使用できるとすると、
これ以上メモリの使用は増えないと思います。
しかし、もう一度「ある処理」をすると、
さらに、メモリの使用量は、増え続け、最終的には、
アプリダウンになってしまいます。

>・DEBUG 環境では delete したメモリがすぐに OS に
> 返却される実装になっている。
>ということではないでしょうか?
CStringやCStringArrayのコンストラクタ・デストラクタ等
の処理を見てみましたが、DEBUGとRELEASEの違いが、
メモリの解放等に影響するようには、見えませんでした。

>#ifdef _DEBUG
>#define new DEBUG_NEW
>をコメントアウトしたら, DEBUG 環境でもメモリ使用量は
>元の値に戻らないかもしれません。
試してみます。ありがとうございます。

dairygoods 2003/10/08(水) 10:19:49
> CStringやCStringArrayのコンストラクタ・デストラクタ等
> の処理を見てみましたが、DEBUGとRELEASEの違いが、
> メモリの解放等に影響するようには、見えませんでした。

いいえ、CStringのRelease版の実装では、
512バイトより短い文字列のメモリは一度確保すると、
アプリケーションが終了するまで解放されないようになっています。
(CString::AllocBuffer()やCFixedAllocクラスの実装をご覧ください。)

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