1

我有一个TThreadList包含所有指向我的服务器创建的对象的指针。服务器有一个线程池,用于向该线程列表中的所有客户端发送数据。它锁定列表,然后在用户断开连接后释放列表,删除对象和引用指针。

问题是:线程池不知道套接字何时断开连接并被删除,因此当池工作时,它将在已以某种方式已被删除的线程列表中选择的指针上进行 AV。

例如,池的Execute方法:

  try
    with userlist.LockList do 
    begin
      for i := Count - 1 downto 0 do
      begin
        if i >= 0 then 
        begin
          p := TClient(items[i]);
          //problem here p gets deleted so it raises items[i] 
          //have an invalid pointer to memory
          if p <> nil then
            if p.sockethex <> nil then
            begin
              sendtexthexpool(p.sockethex, msgprimit+ '|'); //here AV cause P was deleted
            end;
        end;
      end;
    end;
  finally
    userlist.UnlockList;
  end;
end;
4

1 回答 1

6

如果您只有一个指针,那么您无法判断它是否已被释放。你必须让你的程序来跟踪这些信息。

即使您可以检测到您无法检测到的过时指针,它也无济于事。你仍然会有一场比赛。

在您的摘录中,您有一个线程列表。只要在列表锁定时对指针进行所有访问,那么您就不会遇到任何问题。大概您正在释放对象,同时没有锁定列表。解决这个问题,一切都会好起来的。

于 2013-01-18T14:31:27.780 回答