掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
メモリリークが無いのにOSのメモリが減っていく (ID:24279)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
原因となる箇所が突きとめられました。 しかし、環境により発生したりしなかったりとまだまだ謎です。 ソースを示しますが問題部分を大げさに抽出しただけで さらにこれを実行しても現象は発生しませんでした。 下記のようなコードでSaveToFileを呼ぶと現象が発生しメモリが 減っていくようです。 ※Delphiアプリの消費メモリは変動なし、終了してもメモリは回復しない 【概要】 いくつかのTStringListをTListによって管理させます。 ただし生成時、独自拡張したTStringListExを生成させ開放はTStringListとして 実行します。(プログラムミスを再現) 値を入れておいたTStringListExから取り出した値はまとめてファイル化します。 【現象発生の可否】 非力なWindows2000SP3環境で発生。 TPerson.SaveToFileメソッド中のSaveToFileをコメント化すると改善 プログラムミスである TStringList(t[j]).Free; を TStringListEx(t[j]).Free; にすると改善 以下がソースです。 ※TPersonの生成やフォームの定義は省略 // TStringListの拡張クラス type TStringListEx = class(TStringList) private { Private 宣言 } FP : Pointer; public { Public 宣言 } constructor Create(); destructor Destroy();override; end; type TPerson = class(TPersistent) private { Private 宣言 } public { Public 宣言 } function SaveToFile(const FileName : string) : Boolean; end; { TStringListEx } constructor TStringListEx.Create(); begin // 状態を明確にするためメモリを大量確保 FP := AllocMem(1000000); end; destructor TStringListEx.Destroy; begin FreeMem(FP); inherited; end; { TPerson } function TPerson.SaveToFile(const FileName: string): Boolean; var t : TList; ts,tt : TStringList; i,j : Integer; begin t := TList.Create; tt := TStringList.Create; try // TStringListExを生成しリストに追加 for j := 0 to 25 do begin ts := TStringListEx.Create; ts.Add(StringOfChar(Char($41 + j),100)); t.Add(ts); end; // リストから保存用のTStringListを作成し保存 for j := 0 to t.Count-1 do begin ts := TStringList(t[j]); tt.Add(ts.Text); end; tt.SaveToFile(FileName); // 不要なクラスを破棄 for j := 0 to t.Count-1 do begin TStringList(t[j]).Free; // ←問題点 end; t.Clear; finally tt.Free; t.Free; end; end;
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.