いくつかのオブジェクトへのポインタを格納する配列があります。オブジェクトへのポインタしかない場合に、オブジェクトを解放できるかどうかを知りたいです。例えば:
var test_form :Tform;
p: Pointer;
vartest := Tform.create(nil);
p:=@vartest;
実行時にpしか持っていない場合、vartest を解放することは可能ですか?
いくつかのオブジェクトへのポインタを格納する配列があります。オブジェクトへのポインタしかない場合に、オブジェクトを解放できるかどうかを知りたいです。例えば:
var test_form :Tform;
p: Pointer;
vartest := Tform.create(nil);
p:=@vartest;
実行時にpしか持っていない場合、vartest を解放することは可能ですか?
ポインターp
は変数を指しTObject
ます。つまりp
、オブジェクトへの参照へのポインタです。したがって、参照を解除する必要がありますp
。このように:p^
。p
は型指定されていないため、Freeメソッドを呼び出す前にキャストする必要があります。
したがって、これをまとめると、次のようにオブジェクトを解放できます。
TObject(p^).Free;
vartest
ただし、これによって変数が変更されることはありません。オブジェクトを破壊するだけです。同様に設定vartest
したい場合は、次のように設定できます。nil
FreeAndNil(p^);
FreeAndNil
型指定されていないパラメータを取るため、奇妙な獣です。そのため、にキャストする必要はありませんTObject
。
このキャストをすべて回避するには、pを型付きポインタとして宣言することをお勧めします(例:^TObject
または)^TForm
。
ポインタのタイプを指定するだけで、のp: ^TObject
代わりに次のp: pointer
ように記述できます。
var test_form :Tform;
p: ^TObject;
vartest := Tform.create(nil);
p:=@vartest;
....
p^.Free;
次に、を使用p^
してポインタを逆参照し、ポインティングオブジェクトインスタンスを使用できます。
ポインターに関する一般的なアドバイス:ポインターを操作するときは、pointer
(必須でない限り)汎用型を使用せず、代わりに強力な型のポインター(ほとんどのコードp: ^TObject
のすべての型など)を使用することをお勧めします。P* = ^T*
コーディングとデバッグが簡単です。
ただし、リストには、オブジェクト自体ではなく、オブジェクトへのポインタが格納されていることを確認してください。
ほとんどの場合、リストストアオブジェクトはそれ自体を参照します。この場合、に型キャストpointer
するだけTObject
です。
var L: TList;
i: integer;
L := TList.Create;
try
L.Add(TObject.Create); // create an instance and add to the list
...
finally
for i := 0 to L.Count-1 do
TObject(L[0]).Free; // typecast to TObject and free the instance
L.Free; // free the list
end;
もちろん、ここを使用するのが自然な方法かもしれませんが、これは<->タイプキャストTObjectList
の実際のユースケースを示しています。pointer
TObject