メモリ使用量が減らない – プログラミング – Home

メモリ使用量が減らない
 
通知
すべてクリア

メモリ使用量が減らない


roccy
 roccy
(@roccy)
ゲスト
結合: 24年前
投稿: 82
Topic starter  

アプリを起動してある処理をしたあと、処理が終わっても
タスクマネージャのパフォーマンスのメモリ使用量が元に戻りません。
アプリを終了させると、メモリ使用量は、減って元に戻ります。

ある処理とは、
メモリの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
で開発しています。


引用解決済
トピックタグ
アイススケーター
 アイススケーター
(@アイススケーター)
ゲスト
結合: 23年前
投稿: 280
 

クラスのデストラクタでdeleteしなくてはならないのはpNewRecordでは?
おまけに、ローカル変数ではなくクラス内の変数にしなくちゃなららいのではないでしょうか


返信引用
みつるぎ
 みつるぎ
(@みつるぎ)
ゲスト
結合: 22年前
投稿: 3
 

newで作ったオブジェクトはdeleteと対に
しないとリークしますよ。

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 23年前
投稿: 1301
 

アイススケーターさん、みつるぎさん、論点がおかしい。

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

を説明できていません。


返信引用
愚暗
 愚暗
(@愚暗)
ゲスト
結合: 22年前
投稿: 6
 

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

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


返信引用
roccy
 roccy
(@roccy)
ゲスト
結合: 24年前
投稿: 82
Topic starter  

皆さん、ありがとうございます。

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

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

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


返信引用
dairygoods
 dairygoods
(@dairygoods)
ゲスト
結合: 23年前
投稿: 1421
 

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

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました