いくつかのオブジェクトへのポインタを格納する配列があります。オブジェクトへのポインタしかない場合に、オブジェクトを解放できるかどうかを知りたいです。例えば:
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の実際のユースケースを示しています。pointerTObject