ClassListでのクラス管理


Tom  2007-07-20 22:00:44  No: 27123

自作クラスを作成して、そのクラスをTClassListで管理しようと思っています。
動的にクラスを宣言するのですが、
仮に、TFrom1.Showのメソッド内でクラスを宣言した場合、TForm1.Showメソッドが終了すると宣言したクラスは破棄されますよね?
ClassListに追加した場合にはメソッドが終了してもコピーとして残っているのでしょうか?


そうねぇ  2007-07-20 22:32:01  No: 27124

ClassListに追加されるのは、Createしたクラスのインスタンス(実体)でなくて、
その実体を指すポインタなので、実体が無くなれば それは無効なポインタと化し、
参照時に例外が…


Tom  2007-07-20 22:54:44  No: 27125

やはりポインタですか。
TObjectListも同様ですか?


TOBY  URL  2007-08-15 10:04:10  No: 27126

TClassListは、そのまま、FreeすればOKです。
特に解放処理は必要ありません。

といいますか、TClassListは、追加する項目(Item)は、インスタンスではなく、クラス参照ですので、そもそも生成、解放は関係ないです。
値型と同じ扱いでよいです。
TClassListの実装も、TListのItemにそのままTClassの値を代入しているだけです。

TObjectListは、全く別物です。
クラスのインスタンスが格納されるものですので、
どこかしかに、追加した項目(インスタンス)の解放の責任がついて回ります。

TObjectListは、Create時のAOwnsObjectsをTrueにすることで、
TObjectList.Free時に自動的に開放されます。

もし他の場所で解放されるようなものをTObjectListに突っ込む場合は、
AOwnsObjectsをFalseにして、開放しないようにしないといけません。
そうしないと、TObjectList.Free時に、二重に開放処理が行われ、エラーがでます。


TOBY  URL  2007-08-15 10:10:24  No: 27127

あっと、しまった。
もしかして、質問者が勘違いされている可能性があります。

・質問者の言うクラスは、classのインスタンスのことですか?
・TClassとインスタンスの違いはわかりますか?
・「動的にクラスを宣言」というのは、「宣言して、動的に生成する」の間違いではないですか?
・TClassListとTObjectListの違いはわかりますか?

ちょっとこの辺を見直してみてください。

あと、
> 仮に、TFrom1.Showのメソッド内でクラスを宣言した場合、TForm1.Showメソッドが終了すると宣言したクラスは破棄されますよね?

宣言をして、クラスのインスタンスを生成した場合は、
関数外に出た場合には、自動で破棄されません。
手動で、Freeを呼ぶ必要があります。


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

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






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