TThreadList uses an internal TList which is returned by LockList so you can add an observer to it and free whatever needs to be freed in the notification handler.
However, if you're sure you'll never use that feature you can (and probably should) either override the default Remove method or sub-class TThreadList to add a new
RemoveAndFree() method to take care of that.
HTH!
ETA: And yes, you can use almost anything: records, classes, simple types, ... As TList, TThreadList deals only with pointers so you can use whatever you can get a pointer from.
