举个简单例子:
Var
  AEdit,BEdit:TEdit;
  AEdit:=TEdit.Create(Nil) ;
  BEdit:=AEdit;
执行上述代码后,AEdit,BEdit就指向同一个Edit控件了.
现假定我不知道AEdit是否存在,仅通过BEdit,我能否判断对象是否已经销毁了呢?因为如果执行了
AEdit.Free; AEdit:=Nil;后
此时仍有BEdit<>Nil, BEdit Is TEdit =True,但如果再试图通过BEdit去访问的话就会出错.另外想问一下大家意见,实际应用中是否应该允许一个对象有多个引用呢?

解决方案 »

  1.   

    if obj<>nil then if Assigned(obj) then 对象还在的http://lysoft.7u7.net
      

  2.   

    FreeAndNil(Edit1);
    这样就可以完全释放,并且为NIL
      

  3.   

    不对啊
    我已经执行了AEdit.Free; AEdit:=Nil,对象就已经被销毁了
    但因为该对象有多个引用,此时BEdit不会为Nil,所以才想知道应该如果判断
      

  4.   

    To victor_yang(victoryang)
    你可以试试执行FreeAndNil(AEdit);此时BEdit绝对不会为Nil,但实际上他指向的对象已通过AEdirt被销毁了
      

  5.   

    constructor TForm1.Create(...)
    Var
      AEdit,BEdit:TEdit;
    begin
      AEdit:=TEdit.Create(Nil) ;
      AEdit.FreeNotification(Self);
      BEdit:=AEdit;
    end;procedure TForm1.Notification(
      Component : TComponent; Operation : TOperation); //override;
    begin
      if (Component = AEdit) and (Operation = opRemove) then
      begin
        AEdit := nil;
        BEdit := nil;
      end;
    end;有些参数名称可能有出入,自己查一下帮助吧。
      

  6.   

    TO  cybercake(数字蛋糕)
    我明白你的意思了,这的确是一种可行的办法.
    但如果该对象的引用不是两个,而是10个,并且谁都可能执行释放
    那不是要写10遍,并在每个事件里列举其余9个引用出来置为Nil?
    要是那天我想再加一个,那我除了要写一个新的事件外同时还要修改上述10个事件?感觉不爽.暂时撇开存在10个相同引用存在的必要性,我是希望能否直接通过任一个引用来判断他所指向的对象是否已销毁,如果可以做到的话,那即便我再引入100个引用,也不会产生太大的影响.我只需在使用前判断一下,如果还存在的话那我就可以放心地通过他做我想要做的事了.
      

  7.   

    不可能,只能通过置指针为nil来防止访问无效指针,目前没有别的办法判断。你为什么要用几个指针指向一个对象呢?一个指针应该够用了吧。到哪都用他不就行了?
      

  8.   

    Assigned can't detect a dangling pointer--that is, one that isn't nil but no longer points to valid data. For example, in the code example for Assigned, Assigned won't detect the fact that P isn't valid.Assigned函数只判断指针是否为空,不判断指针指向的地址是否合法。所以当多个指针指向同一地址时,如果不知道是否合法,建议使用try..except..end的结构来捕捉异常,然后进行处理。