I don't know much about lnet (and just the fact that it simulates connection behavior for a connectionless protocol tells me to better stay away from it), but when dealing with IO you probably also use some form of parallelization. Then you often have the problem that if you free your IO doing component in one event, another event, either in parallel or scheduled afterwards may try to access that memory after it has been freed.
For example if you have one thread listening for messages and another thread performs the closing of the stream and freeing the object directly afterwards, the listening thread will be woken up when the stream is closed, and may want to access the stream object to check what happend, but that stream object might already been destroyed during the time it took the thread to wake up.
So the main question is, in which context are you calling the disconnect and the Destroy? Is your application threaded, if so from what thread is this called, are there other threads that may access the object at the same time?
Also looking at the source of the TLUDPs disconnect method
(*
* Apply Patch: https://github.com/almindor/lnet/issues/15
* This Issue is not solved yet.
* if disconnect is called within a socket event then FRootSock is not allowed to be freed
* if Disconnect is called outside a socket event then FRootSock needs to be freed otherwise
* a memory leack is created.
*
* as the normal case is that disconnect is called from outside a socket event
* the free method is choosen.
*)
The question is do you call it from within an event handler or from outside?
If you use threading, the quick and dirty solution is usually to just put a sleep(100) or so before the Freeing of the object. A more thourogh way would be to correctly synchronize your threads, but this can be much harder to do properly.
PS: And to say what I always say about this issue, especially if you are new to networking, don't use some high level event based networking libraries for base protocols like raw TCP or UDP. Using the Berkley Sockets API (sockets unit in pascal) is very easy, and you have much more control about when what happens. Only use such libraries when you know very well how they operate, how they use threading and synchronization, etc.