• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:TList->Clear();でメモリ解放不可)

TList->Clear();でメモリ解放不可

このQ&Aのポイント
  • Listのメモリを解放するためにTList->Clear();を使っていましたが、思った通りにメモリが解放されませんでした。
  • ボタンを押すたびにListに新しいノードを追加しましたが、4回目までは問題ありませんでしたが、5回目でエラーが発生しました。
  • 利用するメモリが100万回を超えることはまれですが、どのようにメモリを解放すれば良いのかアドバイスをいただきたいです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

TList::ClearはTList自身が確保したメモリを開放しますが、Addなどで渡されたポインタについては何も行いません。 だって、渡されるポインタが指すオブジェクトがどのように生成されたのかを知るすべがありませんから。 newで生成されたオブジェクトならdeleteできますが、自動変数のポインタを渡される可能性もありますし、malloc系関数でメモリを確保したり、Windowsからメモリを取得する場合もあります。 また、渡されたポインタはvoid*として扱うので、開放すべきメモリのサイズもわからないし、デストラクタ呼び出しもできません。int*、double*、char*を1つのTListに追加して、それぞれ適切に開放できると思いますか?

CLMN
質問者

お礼

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の作り替えが出来ているようです。 ありがとうございました。

すると、全ての回答が全文表示されます。

その他の回答 (1)

回答No.1

C++ Builderを使ったことはありませんが、一般的な疑問として、pt = new UkeM;で確保したメモリーはList->Clear()で解放してくれますか? この手のライブラリーでリストそのものはClearで解放するかもしれませんが、その中身の指し先まで解放することはあまりなさそうな気がします。 自分で一つ一つ要素をたどって解放して、それからClearしたらどうでしょうか。

CLMN
質問者

お礼

hanabutakoさん、ありがとうございました。 2番の回答も含め読み返して、何となく分かりかけた気もします。 一つ一つを消して行ったところ、良さそうな結果となりました。

すると、全ての回答が全文表示されます。

関連するQ&A