要将数据发送到多个客户端,我在TIdThreadSafeStringList
中创建了一个OnConnect
,然后将其分配给AContext->Data
AContext->Data = new TIdThreadSafeStringList
当客户端断开连接时,其字符串列表将在OnDisconnect
中删除
delete AContext->Data
但是,这会导致AV。如果我将参数归零,就像这样
delete AContext->Data
AContext->Data = NULL
AV消失。有一些我不知道的自动清理吗?
使用C ++ Builder 10.2.3。
答案 0 :(得分:1)
有一些我不知道的自动清理吗?
是的。 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
属性,或者根据需要将其用于其他目的。