TIdTCPServer的TIdContext->数据奇数行为

时间:2019-04-11 12:01:32

标签: c++builder indy

要将数据发送到多个客户端,我在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。

1 个答案:

答案 0 :(得分:1)

  

有一些我不知道的自动清理吗?

是的。 TIdContext源自拥有TIdTask属性的DataTIdTask析构函数在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属性,或者根据需要将其用于其他目的。