读书人

对象数组的释放,该怎么处理

发布时间: 2012-03-31 13:13:26 作者: rapoo

对象数组的释放
我有个类
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有值是对的,因为地址还是存在的,但是它已经用不了了
[解决办法]
不信你在释放后可以再调调showmessage(inttostr(TestClient.SocketID)),肯定报错!
[解决办法]
先循环释放ClientList中所有资源,最后ClientList.Free就行了
[解决办法]
(CLientList[0] as TClient).Free;//这里释放后,相当于数组位数减1,原来的CLientList[1]变成CLientList[0]了,所以第0位还是有值存在的
[解决办法]
ClientList.count的数量是否有变呢?又或者你的0,1两个CLIENT的值都一样的?
[解决办法]
首先,建议倒叙释放
其次看看objectlist里做了什么
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;

所以检查一下你类的释放函数是否有问题
[解决办法]
可以试试FreeAndNil
[解决办法]
参考这个帖子
http://topic.csdn.net/u/20120224/23/aa31fd36-9ee6-48d1-9323-da7732bb5be2.html
[解决办法]
不应直接调用Free,你这样做TObjectList并不知道第0个元素已经释放,它的Count是不会变的,从而会造成一些内存错误,应该调用Delete方法

CLientList.Delete(0);

读书人网 >.NET

热点推荐