如何检测TThreadList引用的指针是否无效以避免AV

1 sockets delphi pointers threadpool

我有一个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;
Run Code Online (Sandbox Code Playgroud)

Dav*_*nan 6

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

即使你能检测到一个陈旧的指针,你也做不到,它对你没有帮助.你还会参加比赛.

在您的摘录中,您有一个主题列表.只要在列表被锁定时对指针进行所有访问,那么您将没有任何问题.据推测,你没有锁定列表就释放了对象.解决这个问题,一切都应该好.