是否有一些我不知道的自动清理功能?
是的。 TIdContext 派生自 TIdTask,它拥有 Data 属性。 TIdTask 析构函数在OnDisconnect 事件之后调用,如果Data 对象不是NULL,则将其释放。
处理这种情况的另一种(首选)方法是从 TIdServerContext 派生一个新类,并将您的 TIdThreadSafeStringList 添加到该类(以及您想要的任何其他每个客户端的自定义功能),例如:
class TMyContext : public TIdServerContext
{
public:
TIdThreadSafeStringList *MyList;
__fastcall TMyContext(TIdTCPConnection *AConnection, TIdYarn *AYarn, TIdContextThreadList *AList = NULL)
: TIdServerContext(AConnection, AYarn, AList)
{
MyList = new TIdThreadSafeStringList;
}
__fastcall ~TMyContext()
{
delete MyList;
}
//...
};
然后在激活服务器之前,在运行时将你的类类型分配给服务器的ContextClass 属性,例如:
__fastcall TMyForm::TMyForm(TComponent *Owner)
: TForm(Owner)
{
IdTCPServer1->ContextClass = __classid(TMyContext);
//...
}
然后,您可以简单地将属于服务器的任何 TIdContext* 指针类型转换为您的类类型,以便访问 TIdThreadSafeStringList(或其他功能):
static_cast<TMyContext*>(SomeIdContext)->MyList->...
这样,您可以完全忽略TIdContext::Data 属性,或根据需要将其用于其他目的。