自作クラスを作成して、そのクラスをTClassListで管理しようと思っています。
動的にクラスを宣言するのですが、
仮に、TFrom1.Showのメソッド内でクラスを宣言した場合、TForm1.Showメソッドが終了すると宣言したクラスは破棄されますよね?
ClassListに追加した場合にはメソッドが終了してもコピーとして残っているのでしょうか?
ClassListに追加されるのは、Createしたクラスのインスタンス(実体)でなくて、
その実体を指すポインタなので、実体が無くなれば それは無効なポインタと化し、
参照時に例外が…
やはりポインタですか。
TObjectListも同様ですか?
TClassListは、そのまま、FreeすればOKです。
特に解放処理は必要ありません。
といいますか、TClassListは、追加する項目(Item)は、インスタンスではなく、クラス参照ですので、そもそも生成、解放は関係ないです。
値型と同じ扱いでよいです。
TClassListの実装も、TListのItemにそのままTClassの値を代入しているだけです。
TObjectListは、全く別物です。
クラスのインスタンスが格納されるものですので、
どこかしかに、追加した項目(インスタンス)の解放の責任がついて回ります。
TObjectListは、Create時のAOwnsObjectsをTrueにすることで、
TObjectList.Free時に自動的に開放されます。
もし他の場所で解放されるようなものをTObjectListに突っ込む場合は、
AOwnsObjectsをFalseにして、開放しないようにしないといけません。
そうしないと、TObjectList.Free時に、二重に開放処理が行われ、エラーがでます。
あっと、しまった。
もしかして、質問者が勘違いされている可能性があります。
・質問者の言うクラスは、classのインスタンスのことですか?
・TClassとインスタンスの違いはわかりますか?
・「動的にクラスを宣言」というのは、「宣言して、動的に生成する」の間違いではないですか?
・TClassListとTObjectListの違いはわかりますか?
ちょっとこの辺を見直してみてください。
あと、
> 仮に、TFrom1.Showのメソッド内でクラスを宣言した場合、TForm1.Showメソッドが終了すると宣言したクラスは破棄されますよね?
宣言をして、クラスのインスタンスを生成した場合は、
関数外に出た場合には、自動で破棄されません。
手動で、Freeを呼ぶ必要があります。
ツイート | ![]() |