我有个类
  TClient =Class(TComponent)
  Private
  public
    SocketID:Cardinal; 
    Constructor Create;overload;
    destructor Destroy;overload;
  end;
把该类的多个实例放入数组TObjectList中,如下:
ClientList: TObjectList;NewClient:= TClient.Create;
....
ClientList.Add(NewClient);//然后获取数组第一个元素,目的是测试用
PClient = ^TClient
TestClient:PTClient; 
TestClient^ := TClient(Service.ClientList[0]);现在我想删除掉数组中的元素,
(CLientList[0] as TClient).Free;///////////////这里发现,其实并没有正常释放,用TestClient来查看,还是能得出原来的值。,,请问大侠,如何才能正确的Free掉数组中的对象元素?

解决方案 »

  1.   

    首先
    TestClient:PTClient;
    TestClient^ := TClient(Service.ClientList[0]);应当改成
    TestClient: TClient;
    TestClient := TClient(Service.ClientList[0]);
    其次,你的释放是正确的,而TestClient有值是对的,因为地址还是存在的,但是它已经用不了了
      

  2.   

    不信你在释放后可以再调调showmessage(inttostr(TestClient.SocketID)),肯定报错!
      

  3.   

    先循环释放ClientList中所有资源,最后ClientList.Free就行了
      

  4.   

    (CLientList[0] as TClient).Free;//这里释放后,相当于数组位数减1,原来的CLientList[1]变成CLientList[0]了,所以第0位还是有值存在的
      

  5.   

    ClientList.count的数量是否有变呢?又或者你的0,1两个CLIENT的值都一样的?
      

  6.   

    首先,建议倒叙释放
    其次看看objectlist里做了什么
    procedure TObject.Free;
    begin
      if Self <> nil then
        Destroy;
    end;所以检查一下你类的释放函数是否有问题
      

  7.   

    我只是释放数组中的某个元素而已,并不是全部释放。
    不信你们复制这些代码试试看:
      for i:=0 to  5 do   //放入数组中
      begin
        NewClient:= TClient.Create;
        NewClient.SocketID:= i;
        ClientList.Add(NewClient);
      end;
      GetMem(TestClient,sizeof(TestClient));
      TestClient^ := TClient(ClientList[0]);procedure TMainForm.Button3Click(Sender: TObject);
    begin              
      //销毁
      (CLientList[0] as TClient).Free; //这里类的Free,我直接inherited
    end;showmessage(inttostr(TestClient^.SocketID));  //值仍然是0,等于说Free不管用,不管是free数组中哪个的元素,还是能show出他原来的值。
      

  8.   

    var
      p:TClient;
    begin              //修改了销毁对象的方法
      P:= TClient(ClientList[0]);
      CLientList.Delete(0); //重数组中剔除某元素
      FreeAndNil(P);    //这句话出现了奇怪的异常!同 CLientList.Delete(0);一起使用,都会出现异常。
    end;
      

  9.   

    help!!,这问题已经折磨我好久了
      

  10.   

    参考这个帖子
    http://topic.csdn.net/u/20120224/23/aa31fd36-9ee6-48d1-9323-da7732bb5be2.html
      

  11.   

    不应直接调用Free,你这样做TObjectList并不知道第0个元素已经释放,它的Count是不会变的,从而会造成一些内存错误,应该调用Delete方法CLientList.Delete(0);