※ ChatGPTを利用し、要約された質問です(原文:TList->Clear();でメモリ解放不可)
TList->Clear();でメモリ解放不可
2015/10/07 21:25
このQ&Aのポイント
Listのメモリを解放するためにTList->Clear();を使っていましたが、思った通りにメモリが解放されませんでした。
ボタンを押すたびにListに新しいノードを追加しましたが、4回目までは問題ありませんでしたが、5回目でエラーが発生しました。
利用するメモリが100万回を超えることはまれですが、どのようにメモリを解放すれば良いのかアドバイスをいただきたいです。
C++Builder5を使っています。
TListの使い方で質問します。
List->Clear();で、Listのために使っていたメモリーも解放されるものと思っていました。
ところが、タスクマネージャでのメモリー使用量を見ているとそうなっていないようです。
Form上にあるボタンを押した時に次のような処理を記述しました。
UkeML->Clear();
for(i=0;i<800000;i++){
pt = new UkeM;
strcpy(pt->t,tx);
UkeML->Add(pt);
}
ボタンを何回押しても同じ事が繰り返される、と思ったのですが、私の環境では4回目まで(320万回)はOKですが、5回目でエラーとなります。
私の利用環境において、1回の起動で、ノードの追加が累積100万回を超える事はほぼ考えられないのですが、絶対にない、とは言い切れないので何とかしたいと思っています。
2回目以降で新規のListを作ろうとする時に、それまでのメモリーを解放するためには、どうしたら良いでしょうか?
アドバイスいただければ、と思います。
ちなみに私の環境は、
Win7 Pro 64bit メモリ4Gです。
メモリ8GのPCでも同じ現象でした。
質問の原文を閉じる
質問の原文を表示する
お礼
m-take0220さん、ありがとうございました。 何回か読み返して何となく分かった気がしました。 要は「一つ一つのノードを明示的に削除しなさい」ということですね? そこで次のようにサンプルプログラムを改造してみました。 新しいListを作る直前で、ふるいListを削除する関数を作りました。 その関数では・・・ cnt = UkeML->Count; if(cnt == 0) return; for(i=0;i<cnt;i++){ delete UkeML->Items[i]; } UkeML->Clear(); これで何回Listを作り直してもメモリーは1回目より増えない、ということが分かりました。 処理速度も、ほぼ一瞬でListの作り替えが出来ているようです。 ありがとうございました。