我有个类
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掉数组中的对象元素?
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掉数组中的对象元素?
TestClient:PTClient;
TestClient^ := TClient(Service.ClientList[0]);应当改成
TestClient: TClient;
TestClient := TClient(Service.ClientList[0]);
其次,你的释放是正确的,而TestClient有值是对的,因为地址还是存在的,但是它已经用不了了
其次看看objectlist里做了什么
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;所以检查一下你类的释放函数是否有问题
不信你们复制这些代码试试看:
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出他原来的值。
p:TClient;
begin //修改了销毁对象的方法
P:= TClient(ClientList[0]);
CLientList.Delete(0); //重数组中剔除某元素
FreeAndNil(P); //这句话出现了奇怪的异常!同 CLientList.Delete(0);一起使用,都会出现异常。
end;
http://topic.csdn.net/u/20120224/23/aa31fd36-9ee6-48d1-9323-da7732bb5be2.html