Createしたコントロール、配列変数などの開放

解決


サンデープログラマー  2006-05-23 18:45:56  No: 21757

度々お世話になりますが宜しくお願いします。WinXP+Delphi6  PersonalでVBから初めてのDelphiniに移植中です。

あるデータファイルを読み込んでそのデータ数(例えば生徒数)に応じて必要とするコントロール、変数を動的配列化して生成しています。これで1件目までのテストはうまくいきましたが違うファイルを読み込んで2件目のデータを扱う段階で1件目のために生成されたコントロールなどを一度開放する必要があると思います。ここで

1.コントロール
For i:=1 to NStudent do begin
    ChkName[i]:=TCheckBox.Create(self);
    end;

のように作ったものは一つずつ ChkName[i].Free; のようにすれば開放できるのでしょうか?

2.動的配列変数
SetLength で例えば前回大きな配列をつくったものでも2回目で小さな配列を作り直せばわざわざ開放しないでも良いのかどうか?

など疑心暗鬼でやっています。Delphiでは  xxx.Free;  などとメモリリーク対策を厳密にやっているようですので心配で質問させていただきました。よろしくお願いします。  

これを


ん?  2006-05-23 20:14:17  No: 21758

> のように作ったものは一つずつ ChkName[i].Free; のようにすれば開放できるのでしょうか?

yes

Freeより、FreeAndNilで、nilを入れておいた方が無難。

自分でCreateしたクラスは、自分で責任もって破棄するのが望ましい・・・と思う。
コンポーネントは、Create(Owner) において、Owner を指定しておけば、Ownerの
破棄時に自動的に消えてくれるので、ある程度安心。

今回の場合、TCheckBoxの位置が固定であるなら、きっちり破棄(Free)しておかないと、
コンポーネントが重なり続けるし、要素が減ったときも、以前のTCheckBoxが
表示されたままになるでしょう。

> SetLength で例えば前回大きな配列をつくったものでも2回目で
> 小さな配列を作り直せばわざわざ開放しないでも良いのかどうか?

yes
配列の要素数が変更されるだけなので、ChkName[i].Free してから使用しましょう。


サンデープログラマー  2006-05-23 21:03:49  No: 21759

ん様、ありがとうございました。  これからは
1.一度作ったコンポーネントは必ず消す(Ownerが確定していても一応消すようにします)
2.動的配列は再定義するなら気にしなくて良さそう。
という理解でこれからは自信を持って作ることが出来るようになりました。  ありがとうございました。


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

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






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