配列の中のTStringListのメモリ領域を正しく解放するには?

解決


スレイプニール  2003-09-10 14:22:12  No: 4722

スイマセン、どういう質問タイトルにしたら良いか、分かりませんでした。(笑)

Delphi5 proの質問です。
毎回思うのですが、よく動的配列を作成し、その中にTStringListを
作ることがあります。

SetLength(ar,hoge_count);
for i := 0 to Length(ar)-1 do
  ar[i] := TStringList.Create;

…というカンジです。
それの解放なのですが、良く分からないので、いつもは、

for i := 0 to Length(ar)-1 do
  ar[i].Free;

…とやってるのですが、これは

ar := nil;

…としても同じコトなのでしょうか?
それともメモリリークになるのでしょうか?
あと多次元配列の場合なんかもコレでいけるんでしょうか?
ホント、しょーもない質問で恐縮ですが、確認の仕方が分からず…。(笑)

もうひとつ質問です。
例えば、メインフォームのOnCreateで、グローバルなTStringListをCreateした場合、
OnCloseでFreeするのが妥当だとは思うのですが、これって必ずしないと
いけないものなのでしょうか?
アプリの実行中に使ったメモリは終了時に解放されると聞いたことが
あるのですが…。

#なんかDelphiの、というよりは、プログラミングの基礎みたいな
#質問ですね。(恥


たかみちえ  URL  2003-09-10 16:17:07  No: 4723

クラスの変数は、そのオブジェクト(クラスの実体)がメモリ上のどこにあるかを示しているだけです。
よって、たとえ変数にnilを代入して何も参照しないことにしても、
確かにどこにあるかはわからなくなりますが、当然メモリは開放されません。
開放する方法もわからなくなるので、メモリリークになります。

  動的配列は大丈夫です。クラスと違ってこちらは連続した変数(多次元配列も同じ)Delphiが勝手に開放してくれます。

  メモリリークが不安ならば、MemCheckなどのユニット(Googleかこの掲示板で検索してください)を使ってみてはいかがでしょう?
大体のメモリリークは発見できます。


スレイプニール  2003-09-11 05:41:24  No: 4724

ありがとうございます。よく理解できました。
クラスの配列はひとつひとつ解放しなきゃならないが、
基本データの配列は階層が多次元でもnilでOKなんですね。(理解してることになります?)

MemCheckについても調べてみます。
どうもでした。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加