Freeされたか知るには?

解決


しゅう  2003-03-23 18:25:30  No: 3213

参照先から、参照元がFreeされたかどうかを確認するにはどうすればいいのでしょうか?

---------------------------------------------------------
例)

var S:string;
function Test(T:TObject;St:String):string;
var
  s1,S2:string;
begin
  If T=nil then s1:='T:nil'
           else s1:='T:Not nil';
  if assigned(T) then S2:='T:Assignd=True'
                 else S2:='T:Assignd=False';
  S:=S+ ST+'   '+s1+'   '+s2 +#13+#10;
end;

procedure TForm1.Button1Click(Sender: TObject);
var T,P:TObject;
begin
  T:=TObject.Create;
  P:=T;
  Test(T,'T:create');
  Test(P,'P:create');
  T.Free;
  Test(T,'T:Free');
  Test(P,'P:Free');
  T:=Nil;
  Test(T,'T:Nil');
  Test(P,'P:Nil');
  SHowmessage(S);
end;

結果:
---------------------------
T:create   T:Not nil   T:Assignd=True
P:create   T:Not nil   T:Assignd=True
T:Free   T:Not nil   T:Assignd=True
P:Free   T:Not nil   T:Assignd=True
T:Nil   T:nil   T:Assignd=False
P:Nil   T:Not nil   T:Assignd=True

---------------------------
PからTがFreeされているかどうかを知るにはどうするのでしょうか。

また、Assignedの必要性は何なのでしょうか。
If T<>nil then  と  If Assigned(T) then とは同じでしょうか。


たかみちえ  URL  2003-03-23 18:36:25  No: 3214

> PからTがFreeされているかどうかを知るにはどうするのでしょうか。
  nilかどうか確認すればいいと思いますけど。
  ただ、nilではない無効なデータが入っているとき困るので、
Tを解放後、いちいちnilを代入しておいてもいいかもしれません。

> If?T<>nil?then と If?Assigned(T)?then
  わたしは同じだと思っています。ヘルプにもそういう風にありますし。
  ただ、他の演算と区別しやすくなるし、後ですりかえることもできる分、わたしはAssignedを使ってます。


しゅう  2003-03-23 22:51:38  No: 3215

>> PからTがFreeされているかどうかを知るにはどうするのでしょうか。
>  nilかどうか確認すればいいと思いますけど。
>  ただ、nilではない無効なデータが入っているとき困るので、
>  Tを解放後、いちいちnilを代入しておいてもいいかもしれません。

Pしか見えない状態で、Pの参照先Tが解放されたかどうかを知ることは出来ないのでしょうか?

-------Unit2-----------------------------------
interface
uses Forms,Classes;

var B:TObject;

Procedure Roulette;

implementation
var A:TObject;

Procedure Roulette;
begin
  if Random(100)>50 then A.Free;
end;

begin
  A:=TComponent.create(Application);
  B:=A;
  Randomize;
end.

-------Unit1-----------------------------------
implementation
uses Unit2;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Roulette;
  if B=nil? ...//ここでBの参照元が破棄されているか知るには...?
end;

-----------------------------------------------


たかみちえ  URL  2003-03-24 00:47:00  No: 3216

わざとエラーを起こしてみて(プロパティを呼び出そうとするなど)、それをtry...exceptで捕まえればいいんじゃないでしょうか?

  でも、Aの開放時に、Bに同時にnilを代入しておいたほうが、
お行儀がいい気もしますね。


にしの  2003-03-24 18:24:42  No: 3217

ちょっと問題とはずれているかもしれませんが。

コンポーネントが、自分の所有しているコンポーネントが解放されたかどうか知りたい場合は、Notificationをオーバーライドして判断します。
引数Operationに、追加されたか、削除されたかの値が入ります。
このあたりはヘルプに出ています。ソースを見るとわかりやすいと思います。
もしコンポーネントを作成しているのであれば参考にしてください。


しゅう  2003-03-27 01:23:32  No: 3218

にしのさん、たかちみえさん、返答ありがとうございます。

参照先にもNilを入れる形でプログラムを作り直して、
問題は解決しました。

しかし、Notification(こんなものがあったんですね)
を使ったやり方も面白そうです。
まさにコンポーネントを作っているところなので、試してみることにします。


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

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






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